返回列表中第k大的元素
自己写的,感觉把数组弄成“递减的”更便于操作和理解
int findKth(vector<int> a, int n, int K) {
return quickSelect(a,0,n-1,K);//下标
}
int quickSelect(vector<int>&v,int l,int r,int k){
if(l>r)return -1;
if(l==r)return v[l];
int index=partition(v,l,r);//下标
if(index-l+1==k)return v[index];
else if(index-l+1>k)return quickSelect(v,l,index-1,k);//缩小范围
else return quickSelect(v,index+1,r,k-index+l-1);
}
int partition(vector<int>&v,int l,int r){
int i=l,j=r,key=v[l];
while(i<j){//“递减”序列
while(i<j&&v[j]<=key)j--;
v[i]=v[j];
while(i<j&&v[i]>=key)i++;
v[j]=v[i];
}
v[i]=key;
return i;//返回基准值最终位置/下标
}
网络上的,自己翻译了下:
int partition(vector<int> &input, int l, int r) {
int pivot = input[r-1];//以最后一个为基准值
int i = l;
for (int j=l; j<r-1; ++j) {//除去最后一个外,进行比较
if (input[j] < pivot) {//小于最后一个的移到前面
swap(input[i++], input[j]);//但是单纯的赋值会覆盖原有的元素,造成丢失,应该交换
}
}
swap(input[i], input[r-1]);//将基准值移动到“中间”,此时左边的都是小于的,右边的是大于的
return i;//小于的基准值的“排好序”的元素个数
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> ret;
if (k==0 || k > input.size()) return ret;
int l = 0, r = input.size();
while (l < r) {
int p = partition(input, l, r);
if (p+1 == k) {//算上基准值
return vector<int>({input.begin(), input.begin()+k});
}
if (p+1 < k) l = p + 1;//从上一个基准值的右边开始
else r = p;//从一个基准值的左边开始
}
return ret;
}