某筆試題:記憶體中有乙個長陣列,有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...