package sort;
import sortbasic.SortBase;
public class QuickSort extends SortBase{
public static void sort(Comparable[] a,int begin,int end ){
if(end<=begin) return;
int mid =paritition(a, begin, end);
sort(a, begin, mid-1);
sort(a, mid+1, end);
}
public static int paritition(Comparable[] a ,int begin,int end ){
int i=begin,j=end+1;
Comparable v=a[begin];
while(true){
while(less(a[++i], v))if(i==end)break;
while(less(v,a[--j]))if(j==begin)break;
if(i>=j)break;
exch(a,i,j);
}
exch(a,begin,j);
return j;
}
public static void main(String[] args) {
Comparable[] a = generateArray(10);
show(a);
sort(a, 0,a.length-1);
show(a);
System.out.println(isSorted(a));
}
}
快排的partition方法
我们从首末两端开始 分别找出一个小于第一个数的数和大于第一个数的数,交换
然后索引分别++,--
值得注意的是 当两个指针发生交叉时 就可以终止了 交换第一个数与j指向的数
快排是不稳定的 O(n)~O(n^2)