堆和堆排序

2021-06-21 17:10:14 字數 983 閱讀 9265

這個題大意是有乙個資料結構支援兩種操作a與

get操作,其中

a x表示插入

x. get i

表示返回結構中的第

i小的數.給你

a和get操作的順序和引數

,現在要你對每個

get輸出值

.題解:每次取第k小元素,k不斷更新。使用兩個堆,來完成。 小頂堆負責選出最小的元素,大頂堆負責選出k個元素中最大的元素,即第k小元素 

大頂堆的堆頂元素始終小於小頂堆的堆頂元素

,這樣的話

大頂堆中的所有元素都小於小頂堆中的元素

,如果大頂堆中有k-1個元素,那麼小頂堆的堆頂元素就是要找的 第k小 元素了

sample input

7 4                                         ( n,m,分別是a陣列,u陣列的元素個數)

3 1 -4 2 8 -1000 2               (a陣列)

1 2 6 6  (

數u[i]w為幾就加到a幾,然後輸出第i 小的:輸出陣列a前1個第1小的,前兩個第2小的,前6個第3小的,前6個第4小的)

sample output33

12#include#include#include#includeusing namespace std;

const int maxint=30010;

int num[maxint];

int query[maxint];

priority_queue,less>p2;//大根堆

priority_queue,greater>p1;//小根堆

int main()

{ int m,n,i,j,k;

int temp;

while(scanf("%d%d",&m,&n)!=eof)

{ for(i=0;i

題外話丨分治法  直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。

堆和堆排序

堆是一種靈巧的 部分有序的資料結構,它尤其適合用來實現優先佇列。優先佇列是元素的乙個集合,其中每個元素都包含乙個被稱為元素優先順序的可排序屬性。優先佇列支援下面的操作 通過採用堆這種資料結構可以高效實現這些操作。下文分兩部分 第一部分介紹堆 第二部分講解堆排序。堆可以定義為一棵二叉樹,樹的節點中包含...

堆和堆排序

堆排序演算法 優先佇列 堆的性質的維護,以下都以最大堆為例。堆的維護的主要思想是 逐層下降 舉例 某個結點i,假設其左右子結點left i right i 都已經是最大堆,那麼需要調節 或者說是調換 i,left i right i 的值,並保證調換後的子樹繼續調換下去直到子樹繼續滿足堆的性質。首先...

堆和堆排序

用陣列來儲存堆,下標為i的結點,父節點的編號為 i 1 2,子結點的編號為2 i 1,2 i 2。建立堆 每次插入乙個元素並調整堆的過程。插入乙個元素 插入到陣列最後,更新樹。刪除乙個元素 刪除發生在nums 0 將最後乙個元素調整到nums 0 處,更新樹。長度為len的陣列,最後乙個葉子節點的父...