TOP K算法的实现有很多种方式,其中类似于快排的实现是非常棒的,堆的实现也是非常好的,其中就是关于快排的实现会得到一个TOP K的集合,而这个集合不一定保证里面的数据都是有序的。
下面就献上TOP K算法的quicksort版本:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void partition(int a[],int s,int t,int *k) //这种partion是划分成了两个区域,左侧都大于,右侧都小于
{
int i,j,x;
x=a[s]; //取划分元素
i=s; //扫描指针初值
j=t;
do
{
while((a[j]<x)&&i<j) j--; //从右向左扫描,如果是比划分元素小,则不动
if(i<j) a[i++]=a[j]; //大元素向左边移
while((a[i]>=x)&&i<j) i++; //从左向右扫描,如果是比划分元素大,则不动
if(i<j) a[j--]=a[i]; //小元素向右边移
}
while(i<j); //直到指针i与j相等
a[i]=x; //划分元素就位
*k=i;
}
/*查找数组前K个最大的元素,index:返回数组中最大元素中第K个元素的下标(从0开始编号),high为数组最大下标*/
int FindKMax(int a[],int low,int high,int k)
{
int q;
int *temp;
int index=-1;
if(low < high)
{ temp = &q;
partition(a, low, high,temp);
int len = q - low + 1; //表示第几个位置
if(len == k)
index=q; //返回第k个位置
else if(len < k)
index= FindKMax(a, q + 1, high, k-len);
else
index=FindKMax(a, low, q - 1, k);
}
return index;
}
int main()
{
int a[]= {20,100,4,2,87,9,8,5,46,26};
int Len=sizeof(a)/sizeof(int);
int K=5; //这个K就是TOP K里面的K
FindKMax(a, 0, Len- 1, K) ; //传进去的是a的指针,所以改了就是改了
for(int i = 0 ; i < K ; i++)
// cout<<a[i]<<" ";
printf("%d ",a[i]);
return 0;
}