目的:求数组中第k大(小)数。
方法一:使用堆排序,时间复杂度为O(nlg(k))
代码可以使用优先队列进行设计。
方法二:使用快速排序,利用下标index来进行判断,可以只递归一半,应为另一半必定所有的数据都小于第k大的数。
代码如下:
#include <iostream>
#include "vector"
#include "algorithm"
using namespace std;
int quick(vector<int>& nums, int left, int right){
int temp = nums[left];
while(left < right){
while(left < right && nums[right] < temp){//注意这里进行了调整,其实是从大到小的排序。
--right;
}
if(left < right){
nums[left] = nums[right];
}
while(left < right && nums[left] > temp){//
++left;
}
if(left < right){
nums[right] = nums[left];
}
}
nums[left] = temp;
return left;
}
int top_k(vector<int>& nums, int left, int right, int k){
if(left == right){
return nums[left];
}
int index = quick(nums, left, right);
cout<<"index"<<index<<endl;
if(index + 1 == k){//取下标做对比
cout<<nums[index]<<endl;
return nums[index];
}
int result = -1;
if(index + 1 > k){
result = top_k(nums, left, index - 1, k);//这里只递归了一半,减少时间复杂度
}else if(index + 1 < k){
result = top_k(nums, index + 1, right, k);
}
return result;
}
int main()
{
vector<int> temp = {2,1,5,3,4,7};
int re = top_k(temp, 0, temp.size() - 1, 1);
for_each(temp.begin(), temp.end(),[](const int& a){cout<<a<<" ";});
cout<<endl;
cout<<re<<endl;
return 0;
}