手撕快排

手撕快排

没有自己动手写过虽然知道思想,但是实际写的时候一些边界条件控制不好,只有一个一个代码的敲上去才能学到,而且写一次会忘,那就重复写,我现在是发现自己的学习方法有问题,很多东西以为看一遍理解了思想就够了,其实毫无用处,多看几遍也无济于事,面试被问到还是说不清楚讲不明白。学东西说得深入点是学做东西,不动手做又如何掌握,梅西练习了无数次盘带,才有了被上帝亲吻的身姿和技巧,世间万物也是如此。心里要对自己说,我学会了吗,我真的学会了吗,动手试一下把。

public static void main(String[] args) {
        int a[] = {5,4,3,2,1,8,2,2,5,123,12,3,35};
        quickSort1(a, 0, a.length-1);
        System.out.print("a");
        for(int i: a){
            System.out.print(i+" ");
        }

    }

    //快速排序
    public static void quickSort(int[] a, int lo, int high){
        if(lo >= high) return;
        int j = partion(a, lo, high);
        quickSort(a, lo, j-1);
        quickSort(a, j+1, high);
    }

    public static int partion(int[] a, int lo, int hi) {
        if(lo >= hi || lo < 0 || hi <= 0) return -1;
        //交换法
        int v = a[lo], i = lo, j = hi+1;
        while(true) {
            while(a[++i] < v && i < hi);
            while(a[--j] > v && lo < j);
            if(i >= j) break;
            int t = a[i]; a[i] = a[j]; a[j] = t;
        }
        a[lo] = a[j]; a[j] = v;
        return j;

        //挖坑法,a[lo]被保存下来了,所以相当于一个坑可以给j填,j填完了原来的位置又可以给i填,注意如果和枢值相等必须得填坑,如果不填的话就会死循环
        /*int v = a[lo], i = lo, j = hi;
        while(i < j){
            while(i < j && a[j] >= v) j--; a[i] = a[j];
            while(i < j && a[i] <= v) i++; a[j] = a[i];
        }
        a[i] = v;
        return i;*/
    }

    //无递归方法
    public static void quickSort1(int[] a, int lo, int high){
        Stack<Integer> stack = new Stack<>();
        stack.push(lo);
        stack.push(high);
        while(!stack.empty()){
            int j = stack.pop(), i = stack.pop();
            int p = partion(a, i, j);
            if(i < (p-1)){
                stack.push(i);
                stack.push(p-1);
            }
            if(j > (p+1)){
                stack.push(p+1);
                stack.push(j);
            }
        }
    }
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值