題目描述:
有很多個(n個)無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個(k個)數呢?
1.n=100, k = 10的時候怎麼處理?
2. n=1000, k = 100呢?
3. n=1億億個, k = 100呢?
如果這些數是整數的話,怎麼處理?如果是浮點數呢?
如果這些數是整數,並且存在上界呢?
如果將題目中的"各不相等"這個條件去掉呢? 處理方式又會出現什麼變動麼?
include#include#include//遞迴調整堆,將元素heap[startidx]加入堆中
void maintainheap(int heap, int startidx, int size)
if(rightnode < size && min > heap[rightnode])
if(minidx != startidx)
} return ;
}//建立堆, 即將所有的非葉子結點都從上到下調整一下,加入堆中
void makeheap(int heap, int size)
void topnwithhead(int input, int output, int inputsize, int outputsize) }
return;
}//輸出陣列元素
void printarray(int a, int size)
\n");
}//用打擂台法找到最大的數
int maxinarray(int a, int size)
//用打擂台法找到最大的兩個數
void max2inarray(int a, int size, int* max1, int* max2)
if(a[0]*max1)
else if(a[i] > *max2)
}}int main()
; int output[5];
topnwithhead(input,output, sizeof(input)/ sizeof(int), sizeof(output)/sizeof(int));
printf("原集合為:\n");
printarray(input,sizeof(input)/sizeof(int));
int max1,max2;
printf("最大的數為: %d\n",maxinarray(input,sizeof(input)/sizeof(int)));
max2inarray(input,sizeof(input)/sizeof(int), &max1, &max2);
printf("最大的兩個數為: %d, %d\n", max1, max2);
printf("前%d大的數字為:\n", sizeof(output)/sizeof(int));
printarray(output,sizeof(output)/sizeof(int));
return 0;
}
執行結果:
原集合為:
最大的數為: 23
最大的兩個數為: 23, 22
前5大的數字為:
press any key to continue
N個數裡面找出最大的k個數
出處 題目 給出n個無序的數,然後找出其中最大的k個數 解題思路 首先測試資料有可能會有一億個數,資料量特別的大,資料庫不可能儲存這麼多的資料。如果直接sort排序,nlogn時間複雜度實在是太高,大於10 9。我們可以考慮對資料進行分塊讀取,每次讀取的資料塊大小應大於k。不如先假設第一次讀取的資料...
找出N個資料中的最大的K個資料 堆排序
從n個資料中找出最大的k個資料,而且這裡有乙個限制 記憶體裡存不下所有的n個資料,但是可以存下k個資料。這就讓我們打消了用排序的方法來解的念頭。在這裡我們使用堆排序來完成。因為我們只能有k個資料那麼大的空間,所以我們建乙個k大的堆,將n的前k個資料插入到堆中,然後調整堆。對於堆結構不了解的可以檢視我...
100w個數中找出最大的k個數
1.思路1 我們應該首先想到是先將100w個數排序,暫且不考慮效率問題,可是記憶體中能放得下嗎?2.思路2 堆排序,先從中去k個數進行堆排,然後乙個乙個數進行比較替換,每替換一次都得將堆下調一次,去保證堆得特性 函式findmaxknum 倆件事 一 取k個數進行建堆 二 進行資料替換,替換完一次下...