由c.a.r.hoare在2023年提出,因為此演算法而獲得圖靈獎。它是一種遞迴演算法,核心思想是:先找出乙個數的應該在的位置,將數列分為左右兩部分,左右兩部分分別進行排序。
我們先找到 k 的位置,i 指標先向後移動,所指元素如果比k大,就停止,此時再由 j 由隊尾向前遍歷,如果 j 指向元素比k小,j 停止移動,此時將 i 和 j 指向元素對調。
比如:
此時 i 指向元素r比 k 大,j 指向元素c比k小 ,對調r,c。
此時 i j 根據上述規則 繼續移動,一直到 指標 j 超過了i ,k 和 j 對調
此時k已經在位置上了,將數列分為左右兩邊,左右再進行遞迴排序
//主方法
private static void sort(comparable a, int lo, int hi)
int j = partition(a, lo, hi);
sort(a, 0, j - 1);
sort(a, j + 1, hi);
}private static int partition(comparable a, int lo, int hi)
}// j 也類似
while (less(a[lo],a[--j]))
}// 兩指標擦肩而過的話,就跳出迴圈
if(i>=j)
// 交換 i和j
change(a,i,j);
}// 交換 lo和j
change(a,lo,j);
return j;
}
假設 cn 為快速排序n個數需要比較的次數。
找到第乙個數所在位置,我們需要比較 n+1次。指標 i 和 j 每移動一次就需要比較一次,一共是 n-1次, 加上相遇比較一次 ,擦肩而過還需要比較一次,所以是n+1次。
這個數會把陣列分割成各種情況,會分割成(1,n-1),(2,n-2),(3,n-3).......(n-1,1)各種情況,所以cn的表示式如下:
平均複雜度為1.39nlgn
1. 為了保證效能,快速排序前一定要打亂陣列順序,正序下,快排複雜度需要1/2
乘以n的二次方
2. 如果陣列存在大量相同的數,效能也是平方級的
第一次寫部落格,這是我的理解,如果有誤請指出,我會立即糾正,謝 快速排序演算法筆記
個人理解 1 在一組資料中尋找基準數 2 在左右兩端開始比較,從右開始往左推遇到比基準數小的便停下定位,再從左開始往右推遇到比基準數大的數也停下定位,然後將這兩個數交換位置。4 最後將基準數放到資料中間,右邊留有比基準數大的數,左邊留有比基準數小的數。5 在以基準數為界,將兩邊再次分為兩組資料。6 ...
排序演算法筆記 快速排序 Quicksort
using system using system.collections.generic using system.linq using system.text namespace test sort array,0,array.length 1 console.readline 一次排序單元,完...
快速排序演算法 總結筆記
首先選擇乙個關鍵值key,作為樞軸。一般會將陣列的首個元素選定為key,樞軸。為什麼說是樞軸?是因為待會我們要以這個key為界,把所有小於等於key值的陣列元素放置到key的左側 把所有大於等於key值的元素移到陣列的右側。key,充當了乙個臨界軸的作用,所以叫它樞軸並不為過。定義兩個變數,firs...