quick sort & quick select

我一直被这俩弄的头疼,这次好好写了一晚上,给以后的自己。

不管是quick sort还是quick select,核心都是partition 函数,这里给出标准partition函数,记好:

//quick sort
    int partition(vector<int> &arr, int left, int right) {
        int i = left, j = right;
        int tmp;
        int pivot = arr[(left + right) / 2];
        
        /* partition */
        while (i <= j) {
            while (arr[i] < pivot)
                i++;
            while (arr[j] > pivot)
                j--;
            if (i <= j) {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                i++;
                j--;
            }
        };
        
<strong>        return i; //这里返回i很重要,我试过返回j,结果会有死循环出现</strong>
    }


注意,这里的每一次i和j最后值的含义为,从start~j,所有的element均小于等于pivot, 从i~end,所有的element均大于等于pivot. 如下图所示




到此,为partition函数的意义。

下面基于此partition,分别讲解quick sort和quick select。 


Quick Sort

代码如下:

    void sort(vector<int> &nums,int start,int end) {
        if (start >= end) {
            return;
        }
        int idx = partition(nums, start, end);
        sort(nums,start,idx-1);
        sort(nums, idx, end);
    }

注意,第一句话很关键,不然会dead lock。每次先partition,得道返回值idx,这里的idx相当于上图里所用的i(个人喜好)。

12/8/2016更新, 纠正一下,这里不是个人喜好,如果用i的话各种例子都可以通过,当partition返回j,quicksort和quickselect就会出错


Quick Select

代码如下:

int select(vector<int> &nums,int start, int end,int k) {
        if (start == end) {
            return nums[start];
        }
        int mid = nums[(start+end)/2];
        int idx = partition(nums, start, end);
        int left = idx-start;
        if (left >= k) {
            return select(nums, start, idx-1, k);
        }
        if (left < k) {
            return select(nums, idx, end, k-left);
        }
        return 0;
    }

注意,这里int left = idx-start; left表示了左边剩下了几个数。个人犯傻,在这儿徘徊了好久……希望以后面试碰到相关问题可以秒过。!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值