快速排序演算法是氣泡排序演算法的一種改進,採用「分而治之」的思想,把大的拆分成小的,再把小的拆分成更小的。如:對於一組待排的記錄,通過一趟排序後,將原序列分成兩部分,其中前一部分的所有記錄均比後一部分的所有記錄小,然後再依次對前後兩部分的記錄進行快速排序,遞迴該過程,直到序列中的所有記錄均有序為止。
具體而言,其演算法步驟如下:
(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,則對應的,第一趟排序的結果是:[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 ;
quicksort(a);
for (int i = 0; i < a.length; i ++)
}
private static void quicksort(int a)
private static void sort(int low, int high, int a)
int i = low;
int j = high;
int index = a[i];
while(i < j)
if (i < j)
while(i < j && a[i] <= index)
if (i < j)
}a[i] = index;
sort(low,i-1,a);
sort( i+1,high,a );
}
以上是對快速排序演算法的分析,對於快速排序演算法複雜度分析如下:
(1) 最好的時間複雜度。最好的情況是每次區間劃分的結果都是關鍵字左右兩邊的序列長度相等或者相差為1,即選擇的關鍵字為待排記錄中的中間值,此時,進行的比較次數總共為nlogn,即,最好的時間複雜度為o(nlogn)
(2) 最壞時間複雜度。最壞情況是每次區間劃分的結果都是關鍵字的左邊或者右邊,而另一邊區間中的待排記錄僅比排序前少了乙個,即選擇的關鍵字是待排記錄中的最小值或者最大值,總共需要比較的次數為n(n-1)/2,所以,在最壞情況下快速排序的時間複雜度為o(n*n)。
(3) 平均時間複雜度。快速排序的平均時間複雜度為o(nlogn)。
快速排序具有不穩定性,待排記錄長度較大時,比較好
快速排序演算法詳解
1.1 演算法分析 快速排序是一種不穩定的,時間複雜度為o nlogn 的排序演算法.基本思想 1.選定基準值key。2.通過雙指標不斷地移動,將比key大的值移動到key的右邊,比key小的值移動到key的左邊,直到雙指標相遇 即代表該過程已完成 3.上述過程完成後,對於以原key區分形成的兩個子...
PHP 快速排序演算法詳解
其實快速排序之所以稱之快速,就是因為,氣泡排序是每次對比只交換相鄰的兩個值的位置,這樣每個值要移動到它最終的排序結果中所對應的位置,可能需要很多次位置的變化。但是快速排序可在一次劃分中,就確定你選定的那個對比值在最終排序好的佇列中的位置。概念 快速排序演算法是對冒泡演算法的乙個優化。他的思想是先對陣...
python的快速排序演算法詳解
def quick sort arr if len arr 2 當資料集長度為1時,結束遞迴 return arr mid arr len arr 2 基準數可以隨便選,我這裡就對2取整了 left,right 申明兩個列表用來儲存左右分區的數 arr.remove mid 將基準數從陣列中移除 f...