排序算法

225 阅读1分钟

快排

快速排序算法—图文详解,一篇就够了!-CSDN博客

数组中的第K大个最大元素(leetcode.215)

class Solution {
public:
    // 这里的k是第k大元素的下标,注意区分,下标不是k
    int quickselect(vector<int> &nums, int l, int r, int k) {
        // l、r相等,即只有一个元素
        if (l == r)
            return nums[k];
        // base初始为nums[0]
        int base = nums[l], i = l - 1, j = r + 1;
        while (i < j) {
            // 这里使用do-while,是先执行一次do,后面才会循环
            do i++; while (nums[i] < base);
            do j--; while (nums[j] > base);
            // 符合条件,交换(与csdn不同,这里是两个元素交换,而不是将一个元素移到另一个位置)
            if (i < j)
                swap(nums[i], nums[j]);
        }
        // i = j退出循环,此时在base左边的全是比base小的,右边全是比base大的
        if (k <= j)return quickselect(nums, l, j, k);
        else return quickselect(nums, j + 1, r, k);
    }

    int findKthLargest(vector<int> &nums, int k) {
        int n = nums.size();
        return quickselect(nums, 0, n - 1, n - k);// 这里传进去的是n-k(第k大元素的下标)
    }
};