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

2021-06-09 06:54:34 字數 1620 閱讀 2704

題目描述:

有很多個(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個數進行建堆 二 進行資料替換,替換完一次下...