堆是一種特殊的二叉樹,其堆頂元素是最特殊的元素,對於堆中的任意乙個節點,它的值總是不小於或不大於其父節點的值,堆具有這樣的特性,究竟有什麼用處呢?今天就來看看堆的應用。
堆排序:利用堆來對一組無序的資料進行排序。
堆排序的原理:利用堆刪除的思想來對資料進行排序。堆頂元素是堆中所有元素的最大值或最小值,每次將堆頂元素與堆中的最後乙個元素交換,將堆的元素個數減一,然後再將剩餘的元素進行堆的調整,重複堆刪除的操作,直到堆中剩下乙個元素為止,得到的就是乙個有序的序列。
第一步:建堆
第二步:排序
原始碼如下:
void
swap
(hpdatatype* pleft, hpdatatype* pright)
void
heapadjust
(int
*array,
int size,
int parent)
else}}
void
heapsort
(int
* array,
int size)
//排序
int end = size -1;
while
(end)
}
建堆的時間複雜度是nlogn,
排序的時間複雜度也是nlogn,
堆排序的時間複雜度為nlogn。
top k問題就是在一組資料中,取這組資料中前k個最大值或最小值。也就是將一組資料進行排序,然後取前k個元素。但計算機的記憶體是有限的,也就意味著不能對一組海量資料一次進行排序。
對於n個資料取前k個最大或最小元素:
1.我們可以先取資料的前k個進行建堆
2.再依次將(k+1)到(n)的元素和堆頂元素進行比較,如果滿足條件就將堆頂元素進行替換
直到比較完最後乙個元素,堆中元素就是我們要求的top k。
時間複雜度o(nlogk)
原始碼如下:
void
swap
(hpdatatype* pleft, hpdatatype* pright)
void
heapadjust
(hpdatatype* array,
int size,
int parent)
if(array[parent]
> array[child]
)else}}
void
heaptopk
(hpdatatype* str,
int n,
int k)
for(
int i =
0; i < k; i++
)//將k個資料建乙個小堆,取前k個最大的資料
int root =
(k -2)
/2;for
(; root >=
0; root--
)//將k+1到n的資料依次與堆頂元素比較,如果比堆頂元素大,就將堆頂元素替換成當前進行比較的元素
for(
int j =
0; j < n-k; j++)}
}
堆排序與topK問題
找出乙個有10億數字陣列中,前k個最大值 第一步 hash去重 解法1 劃分法 def partition l,left,right low left if left right key l left high right while low high while low high and l hi...
堆排序 TOPK問題 C
現在有n個數,設計演算法得到前k大的數。k 首先從原列表擷取前k個元素,組成乙個新列表。然後將這個新列表構建成乙個小根堆,那麼根就新列表中最小的數。接著繼續從原列表取出k以後的元素,和小根堆根比對,如果比根小,那麼肯定不屬於前k大的數,如果比根大,替換根,然後做一次向下調整,根重新變成新列表最小的數...
資料結構 堆排序 堆排序 Heap Sort
堆排序是一種選擇排序,其時間複雜度為o nlogn 堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 其中i 1,2,n 2向下取整 若將和此序列對應的一維陣列 即以一...