求N個數中最大的K個數的幾種方法與實現

2021-04-29 21:46:44 字數 1392 閱讀 4456

某筆試題:記憶體中有乙個長陣列,有100w條記錄, 每個記錄為乙個struct array, sizeof( array ) = 512, 在這個struct裡有乙個int型成員變數weight, 現要取得按個weight值從大到小排序的前500個陣列單元(求n裡的前k個大的數)

直接貼**吧,廢話少講(先說方法吧)~~~~解釋在注釋裡:)

const static long n = 10000000; 

const static long k = 100;

static long cnt;

struct elem

long weight;

//char data[512];

};void main()

{srand(time(null));

//直接用資料會越過程式初始棧大小,所在要在堆裡申請空間~~~執行時可以斷一下點,看一下任務管理器占用多少記憶體

elem  * p = new elem[n];

long take = gettickcount();  

//time_t   first,   second; 

//first   =   time(null);     /*   gets   system */

//方法一

//先將最大的k個交換到前面,再對其全排

directsearch( p, k );

quicksort( p, 0, k - 1 );

printelem( p, k );

//方法二

//先用半快排,求出長度為k的區間後,再對其全排

//  partquicksort( p, 0, n - 1, k );

//  quicksort( p, 0, k - 1 );

//  printelem( p, k );

//方法三

//用乙個小根堆儲存這k個數, 遍歷一次即可,每次與第乙個比較, 如果更新了就調整

//heapk( p, k );

//估計做出以上三種方法的實現,面試官都基本滿意啦,一般軟體公司的offer也是**不離十了.

//但是,繼續還有方法...

//解法四: 如果加上限制條件(1) 所有數為整數 (2) 所有數的變化範圍不大 這樣就可以利用記數排序法的思想

//countsort( p, k )

//second   =   time(null);   /*   gets   system   time    again   */

cout<<"tick="<< gettickcount() - take 呵呵,相信在面試時能詳細說出以上幾鐘演算法的優缺點,並現場寫出一兩個,估計他會當場拍板:我找的就是你!

呼~~~當時就是衰在這個上啦, 所以決定完整的做一遍, 基礎還是很重要的!!大家也加油啦~~~

求N個數中最大的K個數的幾種方法與實現

某筆試題 記憶體中有乙個長陣列,有100w條記錄,每個記錄為乙個struct array,sizeof array 512,在這個struct裡有乙個int型成員變數weight,現要取得按個weight值從大到小排序的前500個陣列單元 求n裡的前k個大的數 直接貼 吧,廢話少講 先說方法吧 解釋...

求N個數中最大的K個數的幾種方法與實現

某筆試題 記憶體中有乙個長陣列,有100w條記錄,每個記錄為乙個struct array,sizeof array 512,在這個struct裡有乙個int型成員變數weight,現要取得按個weight值從大到小排序的前500個陣列單元 求n裡的前k個大的數 直接貼 吧,廢話少講 先說方法吧 解釋...

找出N個整數中最大的K個數

所謂 第 前 k大數問題 指的是在長度為n n k 的亂序陣列中s找出從大到小順序的第 前 k個數的問題。解法1 我們可以對這個亂序陣列按照從大到小先行排序,然後取出前k大,總的時間複雜度為o n logn k 解法2 利用選擇排序或互動排序,k次選擇後即可得到第k大的數。總的時間複雜度為o n k...