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++实现