非常简单,三种方法,其实还有分治的简单方法,但是太难写了,算了!
#include <algorithm>
#include <iostream>
using namespace std;
int main ()
{
int k = 5;
int arr [] = {9, 2, 4, 8, 1, 7, 5, 3, 0, 6};
// Way one 全部排序,O(nlogn)
/*
sort (arr, arr + 10);
for (int i = sizeof (arr) / sizeof (arr [0]) - 1; i >= sizeof (arr) / sizeof (arr [0]) - k; i--) {
cout << arr [i] << " ";
}
/**/
// Way two 局部排序,只对前K个大的排序
/*
for (int i = 0; i < k; i++) {
int maxPos = i;
for (int j = i; j < sizeof (arr) / sizeof (arr [0]); j++) {
arr [j] >= arr [maxPos] ? maxPos = j : 1 == 1;
}
if (i != maxPos) {
int temp = arr [i];
arr [i] = arr [maxPos];
arr [maxPos] = temp;
}
}
for (int i = 0; i < k; i++) cout << arr [i] << " " ;
/**/
// Way three 维护前k个的小顶堆,这个方法值是对的,但是并没有排序
int i = k - 1;
while (++i < sizeof (arr) / sizeof (arr [0])) {
// 维护小顶堆,只需要把前k个元素中最小的元素放到最前面即可
int minPos = 0;
for (int j = 0; j < k; j++) arr [minPos] > arr [j] ? minPos = j : 1 == 1;
if (minPos != 0) {int temp = arr [0]; arr [0] = arr [minPos]; arr [minPos] = temp;}
if (arr [0] < arr [i]) {int temp = arr [0]; arr [0] = arr [i]; arr [i] = temp;}
}
for (int j = 0; j < k; j++) cout << arr [j] << " " ;
return 0;
}