#include <stdio.h> int find(const int *arr, int n, double value); void main() { int arr[] = {10,9,5,8,7,1,2,3,4,6}; int k = 3;//获取前3个最大的数 //采用线性时间获取最大最小值 double max = arr[0],min = arr[0]; int index =0; for (index=1;index<10;index++) { if (arr[index]>max) { max = arr[index]; } if (arr[index]<min) { min = arr[index]; } } printf("max:%f,min:%f/n",max,min); double delta = 0.5; while ((max - min) > delta) { double mid = min + (max - min) * 0.5; if (find(arr,10,mid) >= k) { min = mid; } else max = mid; } index = 0; //找到第K大的数 int KMaxNumber = 0; for (;index<10;index++) { if (arr[index] < max && arr[index] > min) { KMaxNumber = arr[index]; break; } } for (index =0;index<10;index++) { if (arr[index]>=KMaxNumber) { printf("%d,",arr[index]); } } getchar(); } int find(const int *arr, int n, double value) { int count = 0; const int *a = arr; for (int index =0;index<n;index++) { if (a[index] >value) { count++; } } return count; }
采用最简单的算法求解了前k大的数,当然还有很多很多优化的算法,这里仅实现了最简单的。