(演算法總結)堆排序的應用 求陣列中第k大的元素

2021-08-21 13:16:27 字數 767 閱讀 6716

(一)預備知識:堆與堆排序

二叉堆是一種非線性的資料結構,是一種完全二叉樹的結構,分為大頂堆和小頂堆兩種,其中大頂堆是指樹中各父節點的值總是大於等於任何乙個子節點的值;而小頂堆則是定義為樹中各父節點的值總是小於等於任何一子節點的值。

一般用二叉堆實現優先順序佇列,其內部調整的時間複雜度為o(logn),c++的標準stl庫的優先順序佇列包括以下5種操作:

(1)取堆頂操作:h.top()

(2)判斷堆空操作:h.empty()

(3)新增元素入堆:h.push(int x)

(4)元素彈出堆:h.pop()

(5)求堆中元素個數:h.size()

其中,取堆頂和彈出堆操作都需要調整堆的結構,時間複雜度都是o(logn),而其他三個操作的時間複雜度都是o(1)。

(二)求陣列中第k大的元素

已知乙個未排序的陣列,求該陣列中的第k大元素,例如陣列如下:

[3,2,1,5,6,4],k=2,第2大數字為5

演算法設計:可以維護乙個size為k的小頂堆q,q的堆頂用於存放每次的第k大的元素。將陣列中的元素依次入堆,當q.size()小於k時(堆並未建完),元素直接入堆;否則,判斷當前元素x與堆頂元素q.top()的大小,若x>q.top(),說明此時的堆頂元素並非第k大,故將堆頂元素彈出,並將x入堆。

**設計如下:

int findkthlargest(std::vectornums, int k) 

} return q.top();

}

排序演算法的陣列實現 堆排序(二)

堆排序 void static heap exchange int a,int b int heap parent int n children int heap left int n parent int heap right int n parent void static max heapif...

java中的排序演算法 堆排序

利用堆這種資料結構設計的一種排序演算法。堆是乙個近似完全二叉 樹的結構,並同時滿足堆的性質 子節點的鍵值或索引總是小於 或大於 它的父節點。對於大 小 頂堆而言,堆頂元素的權值 大 小 堆排序是乙個非常穩定的演算法,對於堆排序而言,數 據的初始順序對它的複雜度並沒有影響。原理 將待排序的數組建堆,然...

歸併排序應用之求陣列中的逆序數

一,問題描述 給定乙個陣列,求解該陣列中有多少組逆序對。比如 7,5,6,4 一共有五對逆序對。分別是 7,6 7,5 7,4 6,4 5,4 二,演算法分析 有兩種方法來求解逆序對 的數目。一種是,對陣列中的每個元素,都與它後面的元素進行比較,若後面的元素比它小,則找到乙個逆序對。這樣,第乙個元素...