快速排序

原理

1、 从待排序区间选择一个数,作为基准值(pivot);
2.、Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的
(可以包含相等的)放到基准值的右边;
3、采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度为1, 代表已经有序,或者小区间的长度 == 0,代表没有数据。

partion原理?

如对于数组{6, 1,2, 7,9 , 3,4 , 5,10 , 8 }
在这里插入图片描述

代码实现:
    public void quickSort(int[] array){
        quick(array,0,array.length-1);
    }
    public void  quick(int[] array,int low,int high){
        if(high-low+1<=100){
            insertSort(array,low,high);
            return;
        }
        int par = partion(array,low,high);
        if(par>low+1){
            quick(array,0,par-1);
        }
        if(par<high-1){
            quick(array,par+1,high);
        }
    }
    public int partion(int[] array,int low,int high){
        int tmp= array[low];
        while (low<high){
            while (low < high && array[high]>=tmp){
                high--;
            }
            array[low] = array[high];
            while (low < high && array[low]<=tmp){
                low++;
            }
            array[high] = array[low];
        }
        array[low] = tmp;
        return low;
    }

非递归 用栈实现:

 public void quickSort2(int[] array){
        Stack<Integer> stack = new Stack<>();
        int low = 0;
        int high = array.length-1;
        int par = partion(array,low,high);
        if(par>low+1){
            stack.push(low);
            stack.push(par-1);
        }
        if(par<high-1){
            stack.push(par+1);
            stack.push(high);
        }
        while (!stack.empty()){
            high = stack.pop();
            low = stack.pop();
            par = partion(array,low,high);
            if(par>low+1){
                stack.push(low);
                stack.push(par-1);
            }
            if(par<high-1){
                stack.push(par+1);
                stack.push(high);
            }
        }
    }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值