C语言实现TOP K算法系列之快速排序实现

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;
}

使用截图

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值