快速排序是常考和找工作經常被問到的排序方式,需要重要掌握
package eighty;
public class Kuaisupaixu {
public static void main(String[] args) {
//快速排序,將長度為N的無重複陣列排序,快速排序平均需要——2NlgN次比較(以及1/6的交換)。快速排序最多需要N2/2次比較,但隨機打亂陣列能夠預防這種情況
int[] a = {33,21,51,54,1,45,12,654,90};
sort(a);
for(int i = 0 ; i < a.length ; i ++) {
System.out.print(a[i]+" ");
}
}
private static void sort(int[] a) {
// TODO Auto-generated method stub
sort(a,0,a.length-1);
}
private static void sort(int[] a, int lo, int hi) {
// TODO Auto-generated method stub
if( hi <= lo ) return; //當上界小於等於下界時,就可以跳出迴圈了
int k = partion(a , lo , hi); //以首元素為界,把它放在應在的位置k,並把小於此元素的元素放在k位置的前面,大於此元素的放在k的位置的後面
sort(a,lo,k-1); //利用遞迴,k元素的前一部分進行快速排序
sort(a,k+1,hi); //利用遞迴,k元素的後一部分進行快速排序
}
private static int partion(int[] a, int lo, int hi) {
// TODO Auto-generated method stub
int i = lo ;
int j = hi +1;
int v = a[lo];
while(true) {
while( less(a[++i],v) ) if( i == hi ) break;
while( less(v,a[--j])) if( j == lo) break;
if(i >= j) break; //利用判斷進行跳出迴圈而不是利用while(i <=j )是因為迴圈條件是要整個迴圈體執行完再判斷,
exchange(a,i,j); //此時可能已經發生了一次違規的交換
}
exchange(a,lo,j); //此時進行最後一次交換,就是把k元素放到應該放在的位置
return j;
}
private static boolean less(int i, int v) {
// TODO Auto-generated method stub
if((i-v)<0)
return true;
else
return false;
}
private static void exchange(int[] a, int i, int j) {
// TODO Auto-generated method stub
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}