解析:題目設定的條件有: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...