如果要排序下標為p到r之間的一組陣列;
選擇p到r之間任意乙個元素做pivot(分割槽點),將小於pivot的元素放在左邊,大於pivot的放在右邊,pivot放在中間。這樣陣列就被分為三個部分,小於pivot的區間a[p, q-1]、等於pivot的區間a[q]、大於pivot的區間a[q+1, r];
根據分治思想和遞迴程式設計技巧,我們可以用遞迴排序區間a[p, q-1]和區間a[q+1, r],直到區間縮小為1,就說明陣列有序了;
遞推公式:quick_sort(p, r) = quick_sort(p, q-1) + quick_sort(q+1, r);
終止條件:p >= r;
因為區分過程中涉及交換操作,如果陣列中有兩個8,乙個是pivot,經過分割槽處理後,後面的8可能放到前面去了。比如陣列1,2 , 3, 9, 8, 11, 8],取後面的8做pivot,那麼分割槽後就會將後面的8與9進行交換。因此,快速排序不是穩定排序演算法。
快速排序也是用遞迴實現的,因此時間複雜度也可以用遞迴公式表示。
最好情況:每次分割槽都可以將陣列分為大小差不多相等的兩部分,這時候時間複雜度為o(nlog);
最差情況:如果某個陣列是已經排序好的,那麼每次得到的兩個區間都極端不等,那麼就需要n次分割槽,每次需要平均掃瞄n/2個元素,這種情況下快排的時間複雜度就是o(n^2);比如([0, 1, 2 , 3, 4, 5, 6, 7, 8, 9])
平均情況:快速排序演算法大部分情況下時間複雜度為o(nlogn),只有在極端情況下才會退化到o(n^2),我們也有很多可以降低這個概率;
快排是一種原地排序演算法,因此空間複雜度為o(1)。
《資料結構與演算法之美》 -- 王爭
資料結構 排序演算法 快速排序
演算法描述 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地...
資料結構和演算法 快速排序
include int a 101 n void quick sort int left,int right int i,j,t,temp if left right return temp a left i left j right 在哨兵i,j 會合之前,將右側找到的小數與左邊找到的大數 互換 ...
資料結構定義和演算法 排序
最好情況 最壞情況 平均情況時間複雜度 排序資料量比較小的時候要考慮 係數 常數 低階 比較次數和交換次數 針對排序演算法的空間複雜度,引入原地排序的概念,原地排序演算法就是指空間複雜度為o 1 的排序演算法 排序的序列中存在等值元素,如果經過排序後,相等元素之間原有的順序不變,就說明這個排序演算法...