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。不如先假設第一次讀取的資料...