算法的思想:
采用快速排序的方式对数组中的元素进行排序(降序排列),每完成一趟排序可以确定一个元素的位置:
(1)如果这个位置恰好是K那么,数组中k之前的元素即为所求
(2)如果这个位置在比k大,那么第k个最大数一定都在这个位置之前,这个位置是前k个最大数的上界。
(3)如果这个位置比k小,那么 第k个最大数一定在这个位置之后,那么这个位置是前k个最大数的下届
初始将上界和下届指定为0和n-1,不断更新上下界的位置,知道最后找到第k个最大元素的位置,输出前k个元素即可。
本算法不用进行完全的排序,找到第k大元素的位置即可。
算法实现如下:
#include <stdio.h> //#include <stdlib.h> #define NUM 10; int partion(int A[],int a,int e); void getFirstK(int A[],int k); int main(int argc,char **argv) { int A[]={1,4,6,2,7,9,2,6,15,14}; getFirstK(A,7); return 1; } int partion(int A[],int a,int e) { int key=A[e]; int i=a-1; int j=a; for (j=a;j<e;j++) { if(A[j]>=key) { i++; int temp=A[i]; A[i]=A[j]; A[j]=temp; } } int temp=A[i+1]; A[i+1]=A[e]; A[e]=temp; return i+1; } void getFirstK(int A[],int k) { int p=0; int lower=0; int higer=NUM-1; p=partion(A,lower,higer); int i; while(1) { if (p==k) { for (i=0;i<k;i++) { printf("%d, ",A[i]); } return ; }else if (p>k) { higer=p-1; p=partion(A,lower,higer); }else{ lower=p+1; p=partion(A,lower,higer); } } }