堆 優先佇列

2021-07-30 18:34:56 字數 1086 閱讀 3408

面試的時候被問到了heapsort,發現自己對資料結構這塊的理解實在不夠,最近打算推翻重新來學一遍。

這裡先簡單地說一下自己對堆的理解。

堆的特質:

1.平衡二叉樹=》保證了操作時間複雜度為logn

2.以最小堆為例,對任意結點,其父節點均小於子節點。=》這樣幾乎各種操作都是在縱向上(深度)進行的。

由於在堆這個資料結構中,經常需要用到父節點和子節點這個概念,因而為了方便父節點與子節點的取出,當我們把堆儲存在陣列中時,設定從初始下標由1開始,這樣父節點的下標就是子節點下標的一半了。

eg:assume the index of parent is i, then the index of left child is 2*i,and thus right child's 2*i+1

下面的問題:

給乙個亂序陣列,如何對其進行排序使其滿足堆的性質?

我們先把問題化小:給定乙個父節點,若已知其左右節點形組成的二叉樹滿足堆性質,那該如何調節,使得這個父節點組成的二叉樹也滿足堆性質。

1.若父節點均小於子節點,那麼這個父節點以下的堆便滿足堆性質。

2.若父節點大於任意乙個子節點,那麼我們需要交換父子結點,這樣引起了乙個問題,這個操作會不會打破被交換的子節點以下的堆的性質?如果父節點過大,大於子節點之下的孩子,那麼我們還需要對子節點以下的堆進行調整,使其滿足堆性質。這樣,遞迴調整下去,直至父節點以下的所有結點都滿足堆性質。

void min_heapify(int arr,int arr_size,int parent)

}

如何進行heapsort:

我們需要將陣列分割開來,一部分為繼續需要排序的heap,一部分為已經排序好的陣列。

在先前的操作中我們可以看到,對於結點的選取調整是基於父節點和子節點下標為一半的關係,所以我們需要傳入的heap初始下標最好為1(或者0),這樣,我們將每次提取的最小節點放在最後(陣列的後半部分),而將需要繼續調整的heap放在前面。

void heap_sort(int arr,int arr_size)

}

由此我們得到了由大至小的陣列排序。

優先佇列《堆》

1.模型 兩個基本操作 insert等價enqueue deletemin刪除最小者 dequeue 2.簡單的實現 1 簡單鍊錶 遍歷刪除min或者排序刪除min 2 使用二叉查詢樹。反覆除去min會使得樹不平衡,並且bst還支援許多不需要的操作。3.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...

優先佇列 堆

印表機列印作業一般是放在佇列中的。如果按照先來先列印的順序,有乙個100頁的列印任務,那麼會讓後面短小的任務等待很長時間。更合理的做法也許是最後處理最耗時的列印任務,不管它是不是最後提交上來的。在多使用者作業系統中,作業系統讓哪個程式使用cpu,是需要決定從佇列裡面選擇的。一般做法是從隊頭獲得程式,...

優先佇列 堆

優先佇列 佇列是乙個操作受限的線性表,資料只能在一端進入,另一端出來,具有先進先出的性質。有時在佇列中需要處理優先順序的情況,即後面進入的資料需要提前出來,這裡就需要優先佇列。優先佇列是至少能夠提供插入和刪除最小值這兩種操作的資料結構。對應於佇列的操作,插入相當於入隊,刪除最小相當於出隊。鍊錶,二叉...