程式設計之美 尋找陣列中最大的K個數

2021-08-06 07:49:10 字數 1515 閱讀 4735

從別人的那裡轉過來,這種題目,其實就是需要使用分治方法

程式設計之美上的尋找n個數中最大的前k數,給出了一種演算法,我認為比較好:

演算法是這樣寫的:

假設n個數儲存在陣列s中,我們從陣列s中隨機選出乙個元素x,把陣列分為兩部分sa和sb.sa中的元素都大於x,sb中的元素都小於x,這時,有兩種可能性:

1.sa中元素的個數小於k,sa中所有的數和sb中最大的k-|sa|個數(|sa|指sa中元素的個數)就是陣列s中最大的k個數。

2.sa中元素的個數大於或等於k,則直接返回sa中最大的k個元素。

平均時間複雜度o(n*log2 k)

偽**如下:

kbig(s,k)  

if(k<=0):  

return  

if(length s<=k):  

return s  

(sa,sb)=partition(s)  

//  

partition(s):  

sa=;  

sb=;  

swap(s[1],s[random()%length s])  

p=s[1]  

for i in [2:length s]:  

length sa

return (sa,sb) 

本人實現的**:

//#include "stdafx.h"

#include

#include

#include

#include

using namespace std;

pair , vector> partitionfun(vector origin)

vector  kbig(vector & s , int k)

}int _tmain(int argc, _tchar* argv)

;vector  myvect(a,a+sizeof(a)/sizeof(int));

// vector tmpvect(a+3,a+15);

cout<<"陣列長度是 "

myvect.push_back(8);

cout<<"陣列長度是 "

for(int i=0;i

cout

// sort(myvect.begin() , myvect.end()); /// /小到大

// reverse(myvect.begin(),myvect.end()); /// 從大道小

//排序後,對元素的修改

for(int i=0;i

cout

for(int i=0;i

cout

return 0;

}

程式設計之美 尋找最大的K個數

有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣...

程式設計之美 尋找最大的K個數

有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣...

程式設計之美 尋找最大的k個數

有很多無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個數呢?idea 1 先用快速排序或者堆排序進行排序,然後取出最大的k個數,時間複雜度為o nlogn o k o nlogn idea 2 進行k趟最大冒泡或者k次大頂堆的輸出,時間複雜度為o n k 根據k與logn的大小比較,選取...