1. 如果先对元素进行排序,复杂度为O(nlogn)
2. 使用小根堆,复杂度O(n) (建堆复杂度为O(n))
3. 使用类似快排的思想,平均复杂度为O(logn)
代码:
#include <iostream>
using namespace std;
int partition(int* array, int i, int j) {
int key = array[i];
int left = i, right = j;
while(left < right) {
if(array[left+1] < key) {
array[left] = array[left+1];
left ++;
} else {
int temp = array[right];
array[right] = array[left+1];
array[left+1] = temp;
right --;
}
}
array[left] = key;
return left;
}
void printMinKeles(int* array, int len, int k) {
// find k mins in array[left, right]
int left = 0, right = len-1;
while(1) {
int p = partition(array, left, right);
int num = p-left+1;
if(num > k) {
right = p-1;
} else {
for(int i = left; i <= p; i++) {
cout << array[i] << " ";
}
if(num == k) break;
k -= num;
left = p+1;
}
}
cout << endl;
}
int main() {
int array[8] = {1, 2, 3, 4, 5, 6, 7, 8};
printMinKeles(array, 8, 4);
int array1[8] = {8, 6, 7, 4, 3, 5, 2, 1};
printMinKeles(array1, 8, 4);
int array2[8] = {8, 6, 6, 5, 2, 5, 2, 1};
printMinKeles(array2, 8, 4);
return 0;
}