快速排序的partition操作

partition操作代码`

public int partition(char[] arr,int low,int high)
        {
            char pivot = arr[low];
            //外层循环
            while (low < high)
            {
            	/*
            	内层循环
            	*/
                //此次循环用来将一个比pivot小的数放到数组的前半部分
                while (low < high && arr[high] > pivot) high--;
                arr[low] = arr[high];
                //此次循环用来将一个比pivot大的数放到数组的后半部分
                while (low < high && arr[low] <= pivot) low++;
                arr[high] = arr[low];
            }

            arr[low] = pivot;
            return low;
        }

几段不易理解的点解析:

  1. 在内层的两个while循环的顺序不能够颠倒,因为初始时将pivot设置为arr[low],如果颠倒顺序将造成arr[high]值·的丢失。
  2. 每次循环都先将arr[high]的值赋给上次循环low所指向的arr[low],然后再将本次循环arr[low]的值赋给arr[high],这样就会造成外层循环结束之后arr[low]处的值在数组中已经存在于arr[high]的位置,所以最后再把pivot(也就是枢纽点)的值再赋值给arr[low],这样就完成了一次partition操作。

partition操作的一个应用

在一个无序数组中取得第key大的值,时间复杂度为O(n)。

			QuickSort qs = new QuickSort();
            int low = 0;
            int high = arr.Length - 1;
            int currentPivotKey = qs.partition(arr, low, high);

            //currentPivotKey代表当前枢纽所处的位置,key代表枢纽的最终位置。
            while (currentPivotKey != key)
            {
                if(currentPivotKey > key)
                {
                    high = currentPivotKey - 1;
                    currentPivotKey = qs.partition(arr, low, high);
                }
                else
                {
                    low = currentPivotKey + 1;
                    currentPivotKey = qs.partition(arr, low, high);
                }
            }

对于这段代码设计的感悟:

  1. 其实我在写代码时总有一种习惯,去思考这段代码如何运行,这种思考问题的方式有些时候是没必要的。比如这段代码,我只要知道一个总体的逻辑就可以,并不用了解计算机如何运行,把运行的问题交给计算机,我们只要告诉计算机怎么做就可以。下面第二点介绍一下设计思路。
  2. 对于该程序,首先要找到一个结束代码的点(什么时候结束),显而易见,当currentPivotKey == key时,就达到我们的目的,代码就可以结束,所以循环判断可以设置成二者不等则继续循环。循环未结束,只可能出现两种情况,currentKey大于或小于key。这时我们要做的就是告诉计算机两种情况分别该做什么即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值