※交换排序(1)——快速排序(quick sort)
快速排序使用分治策略(Divide and Conquer)來把一個序列分為兩個子序列。步驟為:
從序列中挑出一個元素,作為"基準"(pivot).
把所有比基準值小的元素放在基準前面,所有比基準值大的元素放在基準的后面(相同的數可以到任一邊),這個稱為分區(partition)操作。
對每個分區遞歸地進行步驟1~3,遞歸的結束條件是序列的大小是0或1,這時整體已經被排好序了。
快速排序是對冒泡排序的一種改進!
快速排序的代碼如下:
public static void quickSort(int[] numbers,int low,int high) {if(low < high) {int middle = getMiddle(numbers,low,high); quickSort(numbers, low, middle-1); quickSort(numbers, middle+1, high); }} public static int getMiddle(int[] numbers, int low,int high) {int temp = numbers[low]; while(low < high){//高位判斷 while (low < high && numbers[high] > temp) {high--;}numbers[low] = numbers[high]; // 否則情況 numbers[high] > temp 交換位置//低位判斷while (low < high && numbers[low] < temp) {low++;}numbers[high] = numbers[low]; // 否則情況 numbers[low] > temp 交換位置}numbers[low] = temp ; return low ;}備注:
可以采用空位法來梳理整個過程:
比如數組ss:{4,5,7,8,6,3}
temp = ss[0] = 4 ;
排序開始可以認為數組為:{[],5,7,8,6,3} 首位被空出來,以空位代替。
1)與高位比較,有兩種情況:
1.比較位上的數比temp大
此時符合數組比較規律,則數組下標自減。
2.比較位上的數比temp小
則將比較位上的數放入空位。
由于 temp =4 > ss[5] =3,將 ss[5] 放入空位,于是數組變成:{3,5,7,8,6,[]},可以認為被交換位置 ss[5] 被空出來。
2)與低位比較,也有兩種情況:與高位類似。
1.比較位上的數比temp小
此時符合數組比較規律,則數組下標自增。
由于ss[0] = 3 < temp = 4 ,數組下標自增1,到ss[1],{3,5,7,8,6,[]},此時ss[1] = 5 > temp =4不再符合該判斷條件!
2.比較位上的數比temp大
則將比較位上的數放入空位。
由于 ss[1] = 5 > temp =4, 則將ss[1]放入空位。此時的數組排列為:{3,[],7,8,6,5}。
在大while循環條件下,重復以上操作!最終的數組排列為:{3,[],7,8,6,5}。
將temp的值注入其中的空位,數組的排列為:{3,4,7,8,6,5}。
遞歸以上,可以將之看做為:{3},4,{7,8,6,5}
可得到最終排序結果。
擴展:關于快速排序與歸并排序之比較?
歸并排序和快速排序都使用了分治法。
對于歸并排序,大量的工作是將兩個子線性表進行歸并,歸并是在子線性表都排好序之后進行的。
對于快速排序,大量的工作是將線性表劃分為兩個子線性表,劃分是在子線性表排好序前進行的。
在最差情況下,歸并排序的效率高于快速排序,但是,在平均情況下,兩者效率相同O(NlogN)。
歸并排序在歸并兩個子數組時,需要一個臨時數組,而快速排序不需要額外的數組控件,因此,快速排序的空間效率高于歸并排序。
參考文章:http://blog.csdn.net/morewindows/article/details/6684558
end
轉載于:https://www.cnblogs.com/understander/p/6686372.html
總結
以上是生活随笔為你收集整理的※交换排序(1)——快速排序(quick sort)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows绘图基础
- 下一篇: Unity3D资源热更新(一)