今天大鵬哥跟大家一起學習下交換排序中的快速排序。
快速排序是對冒泡排序的一種改進。它的基本思想是,通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到真個序列有序。
快速排序基本步驟:
Step1、定義兩個變量low和high,他們的初值分別爲low和high,此外還有一個變量pivotkey。
Step2、首先從high所指位置向前搜索找到第一個關鍵字小於pivotkey的記錄和pivotkey交換。
Step3、從low所指位置向後搜索,找到第一個關鍵字大魚pivotkey的記錄和pivotkey交換。
Step4、重複以上步驟直到low=high爲止。
待排序列:49 38 65 97 76 13 27 49
1、附設low和high以及設樞軸記錄的關鍵字爲pivotkey:
49 38 65 97 76 13 27 49
↑(low) ↑(high)
↑(pivotkey)
2、從high所指位置向前搜索,找到第一個小於pivotkey的記錄(此處爲27)和樞軸記錄互相交換:
27 38 65 97 76 13 49 49
↑(low) ↑(high)
↑(pivotkey)
3、從low所指位置向後搜索,找到第一個大於pivotkey的記錄(此處爲65)和樞軸記錄互相交換:
27 38 49 97 76 13 65 49
↑(low) ↑(high)
↑(pivotkey)
4、重複2、3步直至low=high爲止。
27 38 13 97 76 49 65 49
↑(low) ↑(high)
↑(pivotkey)
27 38 13 49 76 97 65 49
↑(low) ↑(high)
↑(pivotkey)
27 38 13 49 76 97 65 49
↑(low=high)
↑(pivotkey)
上面給出的是一趟快排過程,整個快排過程可遞歸進行,上述操作完成後,再分別對兩個子序列進行快速排序。
Java實現如下:
public class QuickSort {
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
int[] a={49,38,65,97,76,13,27,49};
int pivotloc,low=0,high=a.length-1;
System.out.print("排序前:");
for(int x:a){
System.out.print(x+",");
}
if(low<high){
pivotloc = quickSort(a,low,high);
quickSort(a,low,pivotloc-1);
quickSort(a,pivotloc+1,high);
}
System.out.print("排序後:");
for(int x:a){
System.out.print(x+",");
}
}
private static int quickSort(int[] a, int low, int high) {
int pivotkey=a[low];
while(low<high){
while(low<high&&a[high]>=pivotkey)
high--;
a[low]=a[high];
while(low<high&&a[low]<=pivotkey)
low++;
a[high]=a[low];
}
a[low]=pivotkey;
return low;
}
}
快速排序的時間複雜度爲O(NlogN)。