1. 程式人生 > >快速排序-java

快速排序-java

分治法: 1. 演算法描述     快速排序(quick-sort)與前面介紹的歸併排序(merge-sort)(見演算法基礎——演算法導論(1))一樣,使用了分治思想。下面是對一個一般的子陣列A[p~r]進行快速排序的分治步驟: ① 分解:陣列A[p~r]被劃分為兩個子陣列A[p~q]和A[q+1~r],使得A[q]大於等於A[p~q]中的每個元素,且小於等於A[q+1~r]中的每個元素。(需要說明的是,我們允許A[p~q]和A[q+1~r]為空) ② 解決:對子陣列A[p~q]和A[q+1~r]遞迴的呼叫快速排序。 ③ 合併:因為子陣列都是原址排序的,所以不需要合併操作,此時的A陣列已經是排好序的。 ps:所謂原址排序是指:我們在對組進行排序的過程中 只有常數個元素被儲存到陣列外面。
下面給出虛擬碼:
可以看出,演算法的關鍵是partiton方法的實現。下面給出它的演算法實現:
直接看可能覺得很暈,我們結合例項看看它是如何工作的:
package chapter1;

import java.util.Arrays;

public class Quick_sort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int [] A={12,3,35,5,6,7,12,1,2};
		quick_sort(A,0,A.length-1);
		System.out.println(Arrays.toString(A));

	}
	
	public static void quick_sort(int [] A,int p,int r){
		if(p<r){
			int q=partition(A,p,r);
			quick_sort(A,p,q-1);
			quick_sort(A,q+1,r);
		}
		
	}
	
	public static 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=i+1;
				//比x小的數A[j]向前移動
				int temp=A[i];
				A[i]=A[j];
				A[j]=temp;
			}
		}
		int tem=A[r];
		A[r]=A[i+1];
		A[i+1]=tem;
		return i+1;
	}
	
}