優先佇列和堆排序

2021-07-22 12:00:49 字數 1557 閱讀 4822

1.    從佇列到優先佇列:

無論棧還是佇列,它們最重要最本質的操作都是入集合,出集合。佇列是在隊尾入隊(插入),在隊頭出隊(刪除)。也即是說先出隊的是先入隊的,那麼存在這麼一種情況,如果排隊的人有著一種優先順序(與排隊順序無關的優先順序)那麼我們就需要一種新的資料結構:優先佇列。它需要插入操作和刪除優先順序最高的元素兩種操作。,

2.    優先佇列的堆實現

在二叉堆的陣列中,每個元素都要保證大於等於另外兩個特定位置的元素。可以用乙個二叉樹很好的表示即所有結點都大於等於它的子結點(如果有的話)。完全二叉樹用陣列就可以表示,因為索引可以把父子結點聯絡起來,向上一層,索引除以二,向下一層,索引是兩倍或者兩倍加一。

3.    優先佇列的對實現的核心操作

我們的父子結點的大小關係和層層遞進的父子關係結合起來維護了整個堆的有序,如果我們要插入元素,就必須放在合適的位置上才能繼續維持有序,這顯然需要移動。當我們將元素插入到最後一位之後(那個位置最小)應該將它向上層移動,直到它的父節點不小於它,這個操作我們稱之為上浮。同時,另乙個操作,刪除最大的元素,最大的元素就是根節點,刪除之後,我們將最後那個元素(最小的元素)放到頂端,讓它向下層移動,我們可以用兩個子節點中大的那個和它交換,直到它比兩個子節點都大。

4.    優先佇列的堆實現步驟

我們選用的資料結構是陣列,索引可以描述這個資料結構,基於優先佇列的操作是插入和刪除最大的元素。,插入我們需要實現上浮操作。上浮操作其實就是基於條件判斷的不斷交換角標對應元素和角標除以二的元素。而刪除最大的元素就是將最後乙個元素放到第乙個元素,然後實現下沉操作。下沉操作是角標對應元素和角標乘以二或者乘以二加一的元素交換直到條件適合為止。

5.    優先佇列的**實現

public class maxpq 

public void insert(int x)

private void swim(int x) }

}

堆排序:

如上所知,堆排序可以找出最大的元素,如果我們不斷找出最大的元素放到最後面,然後恢復優先佇列的結構,再進行,就可以實現排序。這個過程分為兩個階段,堆的構造階段和下沉排序階段。我們可以遞迴的呼叫sink()函式,從而構造起乙個個小堆,進而完成整個堆的構造,第二個階段是先把最大元素放在最後面,然後恢復堆。

public class duisort

} public static void sort(int a)

while(n > 1)

}public static void main(string args)

; duisort.sort(arr);

for(int i=1; i<9 ; i++)

}}

**沒調好,改天慢慢調。。

優先佇列和堆排序

許多應用程式都需要處理有序的元素,但不一定要求它們全部有序,或是不一定要一次就將它們排序。這種情況下,乙個合適的資料結構應該支援兩種操作 刪除最大元素和插入元素。這種資料結構叫做優先佇列。通過插入一列元素然後乙個個地刪掉其中最小的元素,我們可以用優先佇列實現排序演算法。一種名為堆排序的重要排序演算法...

優先佇列 堆排序

一種支援刪除最大元素和插入元素兩種操作的資料結構叫做優先佇列。實現棧or佇列與實現優先佇列的最大不同在於效能的要求。對於棧和佇列,我們實現能在常數時間完成所有操作 而優先佇列,插入元素和刪除最大元素這兩個操作在最壞情況下需要線性時間完成 優先佇列的各種實現在在最壞情況下執行時間的增長數量級 資料結構...

堆排序 優先佇列

1.堆排序 a.堆的定義 n個元素序列當且僅當滿足以下關係時,稱之為堆。ki k2i且ki k2i 1 小根堆 ki k2i且ki k2i 1 大根堆 以下針對最大堆 b.維護堆的性質 max heapify通過讓a i 的值在最大堆中 逐級下降 a i 的值小於其左右孩子的值時 從而使得以i為根結...