堆排序思想 找出100萬個資料中的前100大資料

2021-10-05 03:30:28 字數 1470 閱讀 9555

首先在c++**的檔案下新建乙個txt檔案,命名為test.txt,然後在generate_random.cpp中寫如下**:

先讀取txt檔案中生成的100萬個隨機數,這個量是很大的(其實可以生成更多,這裡用100w為例),如果完整排序後輸出前100大,這樣非常耗時!所以選擇如下演算法:

構造乙個容量為100的小頂堆,將隨機生成數中前100個存進去,然後遍歷剩下的n-100個資料,如果比堆頂大,那麼和堆頂交換,然後執行一次構造小頂堆的函式(所以選擇把構造小頂堆的函式分離出來寫);如果這個數不比堆頂大,那麼捨棄這個數,也就是接著遍歷後面的數…遍歷完剩下的數之後,這個小頂堆也就是儲存的前100大的數了,直接輸出結果即可。

#include

const

long

long n =

1000001

;using

namespace std;

long

long x[n]

,tree[

101]

;void

find_largest_100

(long

long a,

long

long tree)

;void

creat_minheap

(long

long a)

;int

main()

in.close()

;for

(i=1

;i<=

100;i++

)creat_minheap

(tree)

;find_largest_100

(x,tree)

;for

(i=1

;i<=

100;i++

)return0;

}//取前100個數構造小頂堆

void

creat_minheap

(long

long a)

}}}//找前100大的數

void

find_largest_100

(long

long a,

long

long tree)

}

找出N個資料中的最大的K個資料 堆排序

從n個資料中找出最大的k個資料,而且這裡有乙個限制 記憶體裡存不下所有的n個資料,但是可以存下k個資料。這就讓我們打消了用排序的方法來解的念頭。在這裡我們使用堆排序來完成。因為我們只能有k個資料那麼大的空間,所以我們建乙個k大的堆,將n的前k個資料插入到堆中,然後調整堆。對於堆結構不了解的可以檢視我...

堆排序 在n個數中找出K個最大的數

主要思想 在n個數中找k個最大 小 的數,肯定要用到最小堆 最大堆的思想,而這種思想在c中stl中的優先佇列 priority queue 中體現比較明顯,優先佇列底層實現就是運用了最大堆 最小堆原理,如果要求用c實現的話,可以直接用。如果用c語言實現的話,就需要自己定於堆的一系列操作,自己實現最大...

100億資料找出最大的1000個數字

這是網際網路領域乙個比較經典的演算法問題 top k 如何在巨大的資料中找出最大,或者訪問量最高的前10個,前100個或者前1000個資料。比如在2億使用者記錄中找出信用等級最高的,在上億個搜尋詞彙中找出被搜尋次數最高的10個關鍵字。前提是資料儲存在檔案中 一般遇到這個問題,第一反應會想到排序,但是...