基础算法-快速排序

快速排序

选择一个基准值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);

    }

}

猜你喜欢

转载自blog.csdn.net/yzr1183739890/article/details/56678229