快速排序-java
阿新 • • 發佈:2019-02-14
分治法:
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方法的實現。下面給出它的演算法實現:
直接看可能覺得很暈,我們結合例項看看它是如何工作的:
下面給出虛擬碼:
可以看出,演算法的關鍵是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; } }