資料結構 堆排序和TOP K問題

2021-09-23 15:44:00 字數 1686 閱讀 3124

堆是一種特殊的二叉樹,其堆頂元素是最特殊的元素,對於堆中的任意乙個節點,它的值總是不小於或不大於其父節點的值,堆具有這樣的特性,究竟有什麼用處呢?今天就來看看堆的應用。

堆排序:利用堆來對一組無序的資料進行排序。

堆排序的原理:利用堆刪除的思想來對資料進行排序。堆頂元素是堆中所有元素的最大值或最小值,每次將堆頂元素與堆中的最後乙個元素交換,將堆的元素個數減一,然後再將剩餘的元素進行堆的調整,重複堆刪除的操作,直到堆中剩下乙個元素為止,得到的就是乙個有序的序列。

第一步:建堆

第二步:排序

原始碼如下:

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向下取整 若將和此序列對應的一維陣列 即以一...