1. 程式人生 > >C語言實現TOP K算法系列之快速排序實現

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

使用截圖

這裡寫圖片描述