快速排序的五種優化(高頻面試)

2021-10-22 02:56:51 字數 1581 閱讀 3543

void quick_sort_v1(int *arr, int l, int r) 

arr[x] = z;

quick_sort_v1(arr, l, x - 1);

quick_sort_v1(arr, x + 1, r);

return ;

}

單邊遞迴法 quick_sort_v2

單邊遞迴法將一側交給遞迴函式實現,另一側交給本層函式實現

void quick_sort_v2(int *arr, int l, int r) 

arr[x] = z;

quick_sort_v2(arr, l, x - 1);

l = x + 1;

}return ;

}

基準值左側和基準值右側不符合快速排序規定的元素數目必定相等

以此分別在左右部分找到不符合規定元素之後進行交換

void quick_sort_v3(int *arr, int l, int r) 

} while (x <= y);

quick_sort_v3(arr, l, y);

l = x;

}return ;

}

static void unguarded_insert_sort(int *arr, int l, int r) 

swap(arr[l], arr[ind]);

for (int i = l + 2; i <= r; i++)

}return ;}/*

對小區間使用插入排序 quick_sort_v4

*/void quick_sort_v4(int *arr, int l, int r)

} while (x <= y);

quick_sort_v4(arr, l, y);

l = x;

}if (l < r) unguarded_insert_sort(arr, l, r);

return ;

}

void quick_sort_v5(int *arr, int l, int r) 

} while (x <= y);

quick_sort_v5(arr, l, y);

l = x;

}return ;

}

三點取中法 quick_sort_v6

引入middle函式取中間值,相比隨機選取更穩定一些

inline int middle(int *arr, int l, int r) 

void quick_sort_v6(int *arr, int l, int r)

} while (x <= y);

quick_sort_v6(arr, l, y);

l = x;

}return ;

}

快速排序及五種優化(模板)

快速排序排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,遞迴地以達到整個序列有序的目 1 選擇基準 在待排序列中,按照某種方式挑出乙個元素,作為 基準 2 分割操作 以該基準在序列中的實際位置,把序列分成兩...

快速排序優化演算法 五種 c

快排優化 2.聚集元素 3.尾遞迴優化 4.插入排序處理小陣列 快排演算法是基於分治策略的排序演算法,其基本思想是,對於輸入的陣列a low,high 按以下兩個步驟進行排序 1 劃分 以a p 為基準將a low high 劃分為三段a low p 1 a p 和a p 1 high 使得a lo...

五種排序演算法 快速排序

1 在陣列中選乙個基準數 通常為陣列第乙個 2 將所有比基準值小的值擺放在基準的前面,所有比基準值大的擺放在基準的後面 相同的數可以放到任意一邊 在這個分割槽推出之後,該基準就處於數列的中間位置。3 遞迴地把 基準值前面的子數列 和 基準值後面的子數列 進行排序。下面以數列a 30,40,10,20...