JAVA实现快速排序

步骤:

1、确定一个数作为基准,与其他的数作比较,但是这个基准数在比较的过程中是不会跟其他的数交换位置的。一般选取最左边或最右边的数作为基准。

2、选取最左边的数为例,获取往右一位的数下标作为index,同时有一个初始值跟index一样的i作为数组的循环变量,arr[i]跟基准数比较。

3、如果arr[i]小于基准数的话就跟arr[index]交换位置,然后index和i加1,否则只有i加1

4、然后又有两种情况:

第一种是数组中存在比基准数大的情况:

如果是index!=i的情况,那肯定是当前arr[index]比基准数大,那比基数小的arr[i]跟arr[index]换位置,交换之后index+1往右推进一位,这时的arr[index]也是比基准数大的,否则的话早就交换位置了。一轮循环下来之后arr[index]就是比基准数的大的第一个数,将arr[index-1]与基准数互换。现在的arr[index-1]就是原来的基准数了,左边全是比它小的,右边全是比它大的。

第二种是没有比基准数大的情况:

这种情况的话,最后index会比数组最大下标还大一位,arr[index-1]与基准数互换刚好把基准数换到了数组的最后一位。

5、之后利用递归分别对左右两边排序,这是使用了分治的思想,最终会一层层的分为排好序的左右两边小数组,从整个数组来看,已经排好序了。

@Test
    public void test(){
        int[] arr = {12,2,1,43,54,23,45,45,22,32};
        //开始调用递归函数
        quicksock(arr,0,arr.length);
        for (int i : arr) {
            System.out.print(i+",");
        }
    }

    //递归函数
    public void quicksock(int[] arr, int left, int right){
        //先判断划分的数组起始下标,不符合的的话没有必要循环
        if (left < right){
            //开始排序,获取基准数的下标
            int partition = partition(arr, left, right);
            //递归基准数的左边,基准数就不再比较了
            quicksock(arr,left,partition);
            //递归基准数的右边,partition加1,基准数就不再比较了
            quicksock(arr,partition + 1,right);
        }
    }

    //进行排序的函数,返回本次结束后基准所在的下标
    public int partition(int[] arr, int left, int right){
        //每次都以left位置的数为基准
        int pivot = left;
        //为了看得更清晰,定义一个index,为pivot向右一位的下标
        int index = pivot + 1;
        //从index开始遍历循环,
        for (int i = index; i < right; i++) {
            //如果i处的数比基准数小的话则将arr[index]与arr[i]互换位置,然后index加1;
            if (arr[i] < arr[pivot]){
                //交换位置
                change(arr,index,i);
                //index加1
                index++;
            }
            //如果arr[i]比基准数大的话不处理,index也不会加1,所以index与i不相等的情况下,必定是arr[index]>基准,arr[i]小于基准
        }
        //循环完毕之后,不管arr[index]与基准数相比的结果如何,arr[index-1]总是小于或者等于基准数的,互换位置
        change(arr,pivot,index - 1);
        //返回index - 1,即基准数调换位置之后的下标
        return index - 1;
    }

    //交换函数
    public void change(int[] arr, int i, int j){
        int tem = arr[i];
        arr[i] = arr[j];
        arr[j] = tem;
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值