第十关|快速排序

举例: 数组[10,4,3,4,8,9,0,1]:

红色指针指的是起点,蓝色是终点,绿色是需要作为枢轴的节点。

第一轮后:

第一轮排序后,节点4已经到达最终位置。

第二轮左半边后:

节点0已经到达最终位置。

第二轮右半边后

节点9已经到达最终位置。

第三轮:

对于左半边[0,1,3]的左递归[0]:节点0已经到达最终位置,是本身[0]。

对于左半边[0,1,3]的右递归[1,3]:节点1已经到达最终位置,是本身[1,3]。

对于右半边[8,4,9,10]的左递归[8,4]:节点8是已经到达最终位置,是[4,8]。

对于右半边[8,4,9,10]的右递归[9,10]:节点9到达最终位置,是[9,10]。

按理来说:此时已经有序。但递归还没结束。

第四轮:

对于[0]的两个子递归,达到start >= end了,于是return。

之后的几个递归分支,也是如上的形式到最后的return,后续的轮次过程与上述类似。

    private static void quickSort(int[] arr, int start, int end){
        if(start >= end){
            return;
        }

        int left = start, right = end;
        int pivot = arr[(start + end) >> 1];

        while(left <= right){

            //要找大的去交换,遇见小的就往后走
            while(left <= right && arr[left] < pivot){
                left++;
            }

            //要找小的去交换,遇见大的就往前走
            while(left <= right && arr[right] > pivot){
                right--;
            }

            if(left <= right){
                int tmp = arr[left];
                arr[left] = arr[right];
                arr[right] = tmp;

                //交换之后,分别朝原方向继续走
                left++;
                right--;
            }
        }
        quickSort(arr, start, right);
        quickSort(arr, left, end);
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值