快速排序
选择一个基准值x,把比x小的全部放在左边,把大于等于x的值放在右边,然后把x放到这个边界.
这样,如果左边是升序的,那么因为x比左边的都大,左边区间加上x 的这个区间同样是升序的,如果此时右边也是升序的,
那么因为x的值小于等于右边的值,则整个数组是升序的
而每个区间的排序,可以递归调用快速排序完成,如果区间只有一个值就不用排序了。
public class QuickSort {
public static void quickSort(int a[],int l,int r){
if(l<r){//递归出口
int i=l,j=r,x=a[i];//选定第一个元素为基准
while (i<j){
while (i<j&&a[j]>=x)//第一个小于x的值
j--;
if(i<j)
a[i++]=a[j];//小于x的值全部放在左边 (i++好像也没有必要,
// 因为到下面的话,这个值肯定是小于x的,再下面的那个while 中自然会+1
while (i<j&&a[i]<x)//第一个大于等于x的值
i++;
if(i<j)
a[j--]=a[i];//大于等于x的值全部放在右边,(j--同样也没有什么必要)
}
a[i]=x;//正好停留的位置为左边小于x,右边大于等于x
quickSort(a,l,i-1);//递归快排左边
quickSort(a,i+1,r);//递归快排右边
}
}
public static void main(String[]args){
int a[]=new int[100];
SortUtil.randomArray(a);
SortUtil.print(a);
quickSort(a,0,a.length-1);
SortUtil.print(a);
}
}