100w個數中找出最大的k個數

2021-07-12 05:58:38 字數 973 閱讀 5324

1.思路1:我們應該首先想到是先將100w個數排序,暫且不考慮效率問題,可是記憶體中能放得下嗎?

2.思路2:堆排序,先從中去k個數進行堆排,然後乙個乙個數進行比較替換,每替換一次都得將堆下調一次,去保證堆得特性;

函式findmaxknum():倆件事;一、取k個數進行建堆;二、進行資料替換,替換完一次下調一次,保證堆的特性;

函式adjustdown():將堆進行下調;演算法:先找到堆得最後乙個葉子結點父親;即((k-1)-1)/2;

**如下:

#include#includeusing namespace std;

//向下調整

void adjustdown(int* arr, int len, int root)

else

}}void print(int* arr, int len)

cout << endl;

}//100w中找出最大的前k個數

void findmaxknum(int* arr, int n,int k)

//建堆,找最大的k個數,建小堆

i = k;

for ((i - 2) / 2; i >= 0; --i)

//替換資料,並下調資料,使得堆保持它的特性

for (i = k; i < n; ++i) }

print(heap, k);

delete heap;

}void testfindmaxknum()

arr[0] = 999999;

arr[1] = 999999;

arr[2] = 999999;

findmaxknum(arr, 1000000, 100);

delete arr;

}

測試結果如下圖:

在100w個數中找最大的前100個數

1.演算法如下 根據快速排序劃分的思想 1 遞迴對所有資料分成 a,b b b,d 兩個區間,b,d 區間內的數都是大於 a,b 區間內的數 2 對 b,d 重複 1 操作,直到最右邊的區間個數小於100個。注意 a,b 區間不用劃分 3 返回上乙個區間,並返回此區間的數字數目。接著方法仍然是對上一...

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

題目描述 有很多個 n個 無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個 k個 數呢?1.n 100,k 10的時候怎麼處理?2.n 1000,k 100呢?3.n 1億億個,k 100呢?如果這些數是整數的話,怎麼處理?如果是浮點數呢?如果這些數是整數,並且存在上界呢?如果將題目中的...

N個數裡面找出最大的k個數

出處 題目 給出n個無序的數,然後找出其中最大的k個數 解題思路 首先測試資料有可能會有一億個數,資料量特別的大,資料庫不可能儲存這麼多的資料。如果直接sort排序,nlogn時間複雜度實在是太高,大於10 9。我們可以考慮對資料進行分塊讀取,每次讀取的資料塊大小應大於k。不如先假設第一次讀取的資料...