Leetcode215. Kth Largest Element in an Array(基于快速排序及其划分算法)(C++实现)

Leetcode215. Kth Largest Element in an Array(基于快速排序及其划分算法)

题目链接

kth-largest-element-in-an-array

实现代码

class Solution {
public:
	//此处划分算法将大于枢轴值得元素移到枢轴左边,反之移动右边
	//非递增排序
    int Partition(vector<int>& v, int low, int high) {
        int pivot = v[low];
        while(low < high) {
            while(low < high && v[high] <= pivot) --high;
            v[low] = v[high];
            while(low < high && v[low] >= pivot) ++low;
            v[high] = v[low];   
        }
        v[low] = pivot;
        return low;
    }

    int Find(vector<int>& v, int low, int high, int k) {
        int pivotpos = Partition(v, low, high);
        if(pivotpos == k) return v[pivotpos];//若找到则返回
        if(pivotpos > k) return Find(v, low, pivotpos - 1,k);//若k小于此时枢轴的下标值,到左边寻找
        else return Find(v, pivotpos + 1, high,k);//若k大于此时枢轴的下标值,到右边寻找
    }

    int findKthLargest(vector<int>& nums, int k) {
        return Find(nums, 0, nums.size() - 1, k - 1);
    }
};

算法实现

根据题目的要求,在无序顺序表中找到并返回第k大的数。本题采用算法基于快速排序,进行非递增排序,每次划分一趟后,枢轴会落在其排序结束后的最终位置,此时只需将k与枢轴下标比较,若大于则向枢轴左边寻找,否则向右边寻找,进行不断划分,直到找到第k大的元素并返回。算法的平均时间复杂度为O(n)。
快速排序C++实现

测试

测试

鸣谢

感谢LeetCode提供题目和测评平台
感谢王道论坛提供的思路

发布了13 篇原创文章 · 获赞 4 · 访问量 299

猜你喜欢

转载自blog.csdn.net/qq_44486439/article/details/104871773