1. 程式人生 > >FAS ------ 一顆好奇心,一頁好程式碼!

FAS ------ 一顆好奇心,一頁好程式碼!

快速排序面試題記錄–從小到大排序

快速排序每次遞迴確定一個樞紐元素下表,樞紐元素就是位置確定下來已經排好序的元素,樞紐元素左邊的元素都大於等於樞紐元素,右邊的元素都小於等於樞紐元素。
下面是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); } }