一道面試題 求出這10000個數字中最大的500個

2021-06-23 05:46:52 字數 802 閱讀 9909

解析:題目設定的條件有:1)20個陣列 2)每個陣列有500個數,且是公升序排列   求解:最大的500個數

通過分析不難求出要充分利用每個陣列是公升序排列。因此,我們可以從每個陣列中取各自陣列中的最大數,由此,得到乙個陣列,該陣列中的元素有20個。接下來,需要對這20個數字求出最大值,如果利用冒泡或者選擇、直接插入排序,則會對全部數字按有序排列,但時間複雜度為o(n^2)。而我們只需求出該無序陣列中的最大值,因此,想到了堆排序,這裡我們用最大堆,可以求出最大值,時間複雜度為o(logn)。

用最大堆選出最大值,然後取出最大值,即堆排序的第一數,注意標記當前最大值來自哪個陣列(20個陣列中的某乙個)。將該最大值用該值所在的陣列的次大值。再對堆進行重新排序,依次重複500次,則可選擇出500個最大值。

因此,時間複雜度是:o(500logn)。

實現的**樣例如下:

/*原題:有20個陣列,每個陣列裡面有500個數,公升序排列,求出這10000個數中最大的500個,求複雜度。

演算法實現:為簡化,設有5個陣列,每個陣列裡面有10個數,公升序排列,求出50個數中最大的5個數。

*/#includeusing namespace std;

void creatheap(int s,int n) //建堆,最大堆即首元素是最大的

{ //從最後乙個非葉子節點開始

int i,j,k;

i=n/2-1;

j=2*i+1;

for(k=i;k>=0;k--)

{ i=k;

j=2*i+1;

while(j<=n)

{ if(j+1<=n&&s[j]

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...

一道面試題

如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...