快速排序算法原理详解
快速排序算法是冒泡排序算法的一種改進,采用“分而治之”的思想,把大的拆分成小的,再把小的拆分成更小的。如:對于一組待排的記錄,通過一趟排序后,將原序列分成兩部分,其中前一部分的所有記錄均比后一部分的所有記錄小,然后再依次對前后兩部分的記錄進行快速排序,遞歸該過程,直到序列中的所有記錄均有序為止。
具體而言,其算法步驟如下:
(1) 分解。將輸入的序列a[m…n]劃分成兩個非空子序列a[m…k]和a[k+1…n],使a[m…k]中任一元素的值不大于a[k+1…n]中的任一元素。
(2) 遞歸求解。通過遞歸調用快速排序算法分別對a[m…n]和a[k+1…n]進行排序。
(3) 合并。由于對分解出的兩個子序列的排序是就地進行的,所以在a[m…k]和a[k+1…n都排好序后不需要執行任何計算array[m…n]就已排好序。
以數組{38,65,97,76,13,27,49}為例:
第一趟選取的關鍵字是38,則對應的,第一趟排序的結果是:[27 13] 38 [76 97 65 49];
第二趟排序:
對于38左側部分[27 13]進行快速排序,選取的關鍵字是27,排序結果是[13] 27,
對于28右側部分[76 97 65 49]進行快速排序,選取的關鍵字是76,排序結果是[49 65] 76 [97],
因此,第二趟排序的結果是[13] 27 [49 65] 76 [97]
第三趟排序:
對于27左側部分[13],只剩一個元素,則無需排序,同時,27右側沒有元素
對于76左側元素排序[49 65],進行快速排序,選取關鍵字為49,排序結果為49 [65]
對于76右側的元素[97],只有一個元素,則無需排序,
因此,第三趟排序的結果是13 27 49 [65] 76 97
而最終的排序結果是13 27 49 65 76 97
相對應的代碼實現如下:
public class Test {
public static void main(String[] args){
int[] a = {38,65,97,76,13,27,49};
quickSort(a);
for (int i = 0; i < a.length; i ++){
System.out.print( a[i] + “\t” );
}
}
}
以上是對快速排序算法的分析,對于快速排序算法復雜度分析如下:
(1) 最好的時間復雜度。最好的情況是每次區間劃分的結果都是關鍵字左右兩邊的序列長度相等或者相差為1,即選擇的關鍵字為待排記錄中的中間值,此時,進行的比較次數總共為nlogn,即,最好的時間復雜度為O(nlogn)
(2) 最壞時間復雜度。最壞情況是每次區間劃分的結果都是關鍵字的左邊或者右邊,而另一邊區間中的待排記錄僅比排序前少了一個,即選擇的關鍵字是待排記錄中的最小值或者最大值,總共需要比較的次數為n(n-1)/2,所以,在最壞情況下快速排序的時間復雜度為O(n*n)。
(3) 平均時間復雜度。快速排序的平均時間復雜度為O(nlogn)。
快速排序具有不穩定性,待排記錄長度較大時,比較好
總結
以上是生活随笔為你收集整理的快速排序算法原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 极简随机音乐播放器
- 下一篇: pgpool 之六 pgpool 的一些