算法導論:快速排序

  快速排序的原理:

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]);
		}
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章