快速排序

基本思想

1、确定切分元素v,一般将最左边元素当作切分元素

2、指针left从左侧开始找到大于v的元素

3、指针right从右侧开始找到小于v的元素

4、交换两个元素

5、重复以上步骤,直到 left>right,停止

经过以上步骤,即找到切分元素的正确位置

切分

1、 对于某一个 j ,a[j]已经排定

2、a[0] 到 a[j-1] 元素全部小于 a[j]

3、a[j+1] 到 a[N-1] 元素全部大于 a[j]

代码:


public class QuickSort {
    public static int partition(int[] a,int lo,int hi){
        /**
         * 1、确定左边第一个是切分元素v,切分元素经过此函数后,就找到了自己正确的位置
         * 2、i指示左侧小于v,j指示右侧大于v。一旦i指示元素大于v,j知识元素小于v,交换i,j指示元素
         * 3、当i>=j,跳出,此时j指示元素小于v,i指示元素大于v
         * 4、交换v和j指示元素,这样v就排定了位置,返回此时位置j。
         */
        int i=lo,j=hi+1;
        int v=a[lo];//切分元素
        while(true){
            while(a[++i]<v) if(i==hi) break;
            while(a[--j]>v) if(j==lo) break;
            if(i>=j) break;
            CTool.exch(a,i,j);//这里是交换元素
        }
        CTool.exch(a,lo,j);
        return j;
    }
    public static void sort(int[] a,int lo,int hi){
        //递归,就剩下一个元素时,不需要排序,返回
        if(lo>=hi) return;
        int j=partition(a,lo,hi);//确定切分元素j的位置
        sort(a,lo,j-1);
        sort(a,j+1,hi);
    }

    public static void main(String[] args) {
        int[] A=new int[]{3,7,4,2,6,1,5,6};
        sort(A,0,A.length-1);
        for (int e:A) {
            System.out.println(e);
        }
    }
}

其中,exch,交换函数

public static void exch(int[] a,int i,int j){
        int t=a[i];
        a[i]=a[j];
        a[j]=t;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值