FAS ------ 一顆好奇心,一頁好程式碼!
阿新 • • 發佈:2019-02-01
快速排序面試題記錄–從小到大排序
快速排序每次遞迴確定一個樞紐元素下表,樞紐元素就是位置確定下來已經排好序的元素,樞紐元素左邊的元素都大於等於樞紐元素,右邊的元素都小於等於樞紐元素。
下面是c++的快速排序程式碼:
// 函式引數傳入的座標區間遵循左閉右開原則
int FindPivot(int *arr, int start, int end) {
// 把arr[start,end)該區間第一個元素定為待確定位置的樞紐元
int pivot = arr[start];
// 防止陣列越界
--end;
while (start < end) {
// 由於待確定的位置的元素在最右邊,本次我們從最左邊開始查詢小於樞紐元的元素。
// 這個while迴圈結束的條件是我們找到了小於樞紐元的元素,或者樞紐元素就是最小元素end==start,arr[start] = pivot;
while ((end > start) && (arr[end] > pivot)) --end;
if (end == start) {
break;
}
// 如果找到小於樞紐元素的值a
// 把小於樞紐元素的值a放到樞紐元素的位置,此時arr[start]==a,arr[end]==a
// arr[end]這個位置空間用於儲存下面這個while迴圈找到的大於樞紐元的值b
arr[start++] = arr[end];
// 從右向左查詢大於樞紐元的元素
while ((start < end) && (arr[start] < pivot)) ++start;
// 如果找到元素a的舊位置依舊沒有找到比樞紐元大的元素,end==start,說明a的舊位置可以用來儲存樞紐元素,畢竟a舊位置右邊的元素都大於a,arr[start] = pivot;
if (end == start) {
break;
}
// 如果在start==end前找到了大於樞紐元的元素b,則把b儲存a元素的舊位置,此時從b的新位置之後所有的元素都大於a。end--用於下次從b左邊一個位置開始查詢。
arr[end--] = arr[start];
}
arr[start] = pivot;
return start;
}
void QuickSort(int* arr, int start, int end) {
if (end > start) {
int pivot = FindPivot(arr, start, end);
QuickSort(arr, start, pivot);
QuickSort(arr, pivot + 1, end);
}
}