快速排序的原理:
1.選取一個元素q,術語叫做主元2.循環數組a,將數組分割成 a[p...q-1] (小於主元部分) 和 a[q+1....r](大於主元部分)兩部分,中間位置即選取主元q排序後的的位置。
3.循環迭代被分隔的數組即a[p...q-1] 和 a[q+1...r] 繼續重複1,2步驟,這樣數組就變成一個有序的數組。
僞代碼如下:
其中partition的過程如下:
如圖所示,其中淺陰影的部分是值不大於a[r]的值,深陰影的部分是大於a[r]的值,無陰影的元素是尚未進行排序的元素,r元素爲主元。
a)所有元素都未進行排序。
b)數值2爲小於主元的元素,需要進行交換,此刻i與j的值相同,只能與自己交換。
c)-d)都大於主元,被劃入大於主元元素的那一部分中。
e)1爲小於主元的元素,與8交換,並且小於主元的部分下標增加。
f)同上
g)-h)較大元素部分增加,並且循環結束。
i)主元被交換到兩個數組的中間部分,至此完成了一次排序,後續再去各自遞歸調用被分好組的兩部分,即大於主元的小於主元的數組再重複上述過程,
這樣數組元素就進行了排序。
下面是java代碼實現過程
public class QuickSort {
/**
* 快速排序的原理:
* 1.選取一個元素q,術語叫做主元
* 2.循環數組a,將數組分割成 a[p...q-1] 和 a[q+1....r]兩部分,中間位置即選取主元q排序後的的位置。
* 3.循環迭代被分隔的數組即a[p...q-1] 和 a[q+1...r] 繼續重複1,2步驟,這樣數組就變成一個有序的數組。
*
*/
public void quickSort(int [] a,int p ,int r ){
if(p<r){
//找出主元排序後在數組中的下標
int q = partition(a,p,r);
//分割後繼續排序
quickSort(a,p,q-1);
quickSort(a,q+1,r);
}
}
private int partition(int [] a,int p ,int r){
//選取主元,默認爲最後一個元素
int x = a[r];
int i=p-1;
for(int j=p;j<r;j++){
if(a[j]<x){
i++;
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
int t = a[i+1];
a[i+1] = a[r];
a[r] = t;
return i+1;
}
public static void main(String[] args) {
QuickSort sort = new QuickSort();
int [] a = {2,8,6,1,3,10,4};
sort.quickSort(a, 0, a.length-1);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
}