第k大数
思路1:
排序+直接读取下标 O(nlogn)
思路2:
快排的近似,最差O(n^2), 理想O (n)
#include<iostream>
using namespace std;
int position(int arr[], int left, int right){
int p = left;
int q = right;
int mid = arr[left];
while(p <= q){
while(p <= q && arr[p] <= mid) p++;
while(p <= q && arr[q] > mid) q--;
if(p < q){
swap(arr[p], arr[q]);
}
}
swap(arr[q], arr[left]);
return q;
}
int kmin(int arr[], int left, int right, int k){
if(left < right){
int pos = position(arr, left, right);
int posk = pos + 1;
if(posk == k){
return arr[pos];
} else if(posk > k){
return kmin(arr, left, pos - 1, k);
} else {
return kmin(arr, pos + 1, right, k);
}
} else if(left == right){ // 补充条件 快排只剩一个数即left = right时不必处理,但是第k大数只剩一个数时就是其本身,如果是上面会漏掉
return arr[left];
}
}
int main() {
int arr[] = {12,5,14,3,27,8,4,9};
// cout<<kmin(arr, 0, 7, 1)<<endl;
// cout<<kmin(arr, 0, 7, 2)<<endl; 2
// cout<<kmin(arr, 0, 7, 3)<<endl;
// cout<<kmin(arr, 0, 7, 4)<<endl;
// cout<<kmin(arr, 0, 7, 5)<<endl;
// cout<<kmin(arr, 0, 7, 6)<<endl;
// cout<<kmin(arr, 0, 7, 8)<<endl;
return 0;
}