#include<iostream>
using namespace std;
int partition(int* array, int low, int high) {
if (array && low < high) {
int flag = array[low];
while (low < high) {
while (low < high && array[high] >= flag) {
high--;
}
array[low] = array[high];
while (low < high && array[low] <= flag) {
low++;
}
array[high] = array[low];
}
array[low] = flag;
return low;
}
return 0;
}
void getTopK(int* array, int N, int k) {
if (!array || N <= 0 || N <= k) {
return;
}
int low = 0;
int high = N - 1;
int index = partition(array, low, high);
//不断调整分治的位置,直到position = k-1
while (index != k - 1) {
//大了,往前调整
if (index > k - 1) {
high = index - 1;
index = partition(array, low, high);
}
//小了,往后调整
else {
low = index + 1;
index = partition(array, low, high);
}
}
}
int main() {
//text
int a[] = { 7, 3, 2, 4, 5,8,9,10,1 };
for (auto i: a)
cout << i << " ";
cout << endl;
getTopK(a, sizeof(a)/sizeof(*a), 3);
for (auto i : a)
cout << i << " ";
cout << endl;
system("pause");
}
获取数组的前K小个数
最新推荐文章于 2023-10-20 13:25:53 发布