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