快速排序的思想近似於bst里根節點與左右節點的關係。
大致思想是選擇乙個軸值,然後把陣列裡比軸值小的放在左邊,比軸值大的放在右邊,通過遞迴處理兩邊的陣列達到總體排序的效果。
主框架如下:
templatevoid qsort(e a, int i, int j)
findpiovt函式找乙個軸值
影響快排時間複雜度最大的就是軸值的選擇,對於未排序的陣列而言,軸值的選擇最好是隨機的,這裡簡單的取陣列中間的值作為軸值。
templateint findpivot(e a, int i, int j)
partition函式用來交換陣列軸值左右的元素
不需要保證交換後陣列是有序的,這交給接下來分隔後的陣列去做。
templateint partition(e a, int l, int r, e& pivot) while (l < r); //左右邊界交錯即停止
swap(a, l, r); //交錯後會有一次不必要的交換,這裡把它調整過來
return l; //返回此時的左邊界
}
測試**如下:
#includeusing namespace std;
templatevoid swap(e a, int a, int b)
templateint partition(e a, int l, int r, e& pivot) while (l < r);
swap(a, l, r);
return l;
}templateint findpivot(e a, int i, int j)
templatevoid qsort(e a, int i, int j)
int main() ;
qsort(arr,0,(sizeof(arr)/sizeof(int))-1);
for(auto i : arr){
cout《說一下時間複雜度
一般認為快排的時間複雜度為θ(nlogn),最差情況就是軸值的選擇沒有很好的分隔陣列,選擇了最大或最小的那個數,那麼在下一次遞迴排序中需要排序的陣列大小和原來差不多大,此時的時間複雜度就變為o(n²)。
排序 快速排序,C 實現
本文 的github位址 基本思想 快速排序 是對 氣泡排序 的改進。基本原理 基於分治法,在待排線性表中取乙個元素pivot作為樞軸值,通過一趟排序將待排線性表劃分為獨立的兩部分,第一部分的所有元素小於pivot,第二部分的所有元素大於等於pivot,pivot位於其最終位置。遞迴對兩個子表做快速...
快速排序 c 實現
快速排序思想 基於分治策略,對氣泡排序的一種改進。對於要排序的乙個序列,從中選一值進行排序,將其放入到正確的位置position。然後以position為界,對左右兩部分再做排序。直到劃分的長度為1。步驟 設有一待排序的序列 1.分別設定low hight指向序列的最左端 最右端 從序列中選乙個進行...
快速排序(C 實現)
include using namespace std void swap int a,int b int sort int begin,int end if beginwhile beginif begin return begin void quicksort int begin,int end...