從乙個序列中獲取前K大的數的一種方法

2021-06-28 00:41:20 字數 910 閱讀 4555

這個方法是利用快速排序的。在快速排序中,得到中間元素(pivot)之後,比較中間元素之前的元素個數和k的大小關係,從而確定後面該往哪個方向繼續遞迴。如果中間元素前面的元素個數等於k,那就停止遞迴過程;如果中間元素前面元素個數小於k,那就再中間元素後面進行遞迴;否則就往中間元素前面進行遞迴。這樣最終得到的是沒有排序的前k大的元素,這樣再對前k個元素進行一次真正的快速排序。這樣就能得到排好序的前k大元素。我隨機生成了乙個100000個整型資料的檔案進行測試,求前10000個元素。這樣做用了0.984s,然後如果直接用快速排序對整個序列進行快速排序,再取前10000個的話,用了1.05。這在某種程度上優化了這個問題。

#include#include#include#include#include#include#includeusing namespace std;

templateclass quicksort

static void topn(elem a,int i,int j,int n)//get the top n from a[i],...,a[j]

};int a[100005];

int main(){ 

clock_t start=clock();

freopen("rand.txt","r",stdin);

for(int i=0;i<100000;i++) scanf("%d",&a[i]);

quicksort::topn(a,0,99999,10000);

quicksort::sort(a,0,9999);

for(int i=0;i<9999;i++) printf("%d ",a[i]);

printf("\n");

cout<<"time used:"<<(double)(clock()-start)/clocks_per_sec<<"s"<



陣列中前k大的數

問題 程式設計之美 page139.尋找最大的k個數。方法一 通過全排序 快速排序 然後獲取前k個數即位最大的k個數。演算法複雜度 o nlogn 方法二 通過部分排序。選擇排序,氣泡排序 直接獲取前k個最大的數。演算法複雜度o n k 當k比較小的時候可以考慮 方法三 快速排序的變種。前面尋找陣列...

從乙個無序陣列中求出第K大 小的數

這個題目可以作為練習寫大 小根堆的實現,不過貌似時間複雜度還是蠻高的。在洛谷上面一道模板題上面好像就超時了幾個點,不知道是不是我實現的問題。那麼除此之外,最容易想到的方法是先對該陣列進行排序,然後取出第k或max k數來。當選擇使用快排的時候,時間複雜度是 o nlogn 但還有一種更優的方法是利用...

找出乙個陣列中的前k個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。例如,給定陣列 1,1,1,2,2,3 和 k 2,返回 1,2 注意 你可以假設給定的 k 總是合理的,1 k 陣列中不相同的元素的個數。第一步基本都是一致的,需要統計出每個元素的出現次數 先遍歷一遍陣列,以陣列的值做key存放到map中,初...