優先佇列與堆排序

2021-07-16 03:16:41 字數 1292 閱讀 9289

許多應用程式在資料處理是,需要有序的處理資料,但是不一定要求他們全部有序,或著是不一定要一次就將整個資料進行排序。例如有些我們收集了一些元素,然後處理這些元素中的最大值。這個時候,對這兒陣列進行排序沒有必要,這就引出我們今天介紹的優先佇列。

優先佇列時一種抽象資料型別,其最重要的操作就是刪除最大元素和插入元素。

例如任務排程,我們需要取出任務佇列裡優先順序最高的任務拿出來去執行

1、當一顆二叉樹的每個節點都大於等於它的子節點時,它被稱為堆有序

2、根節點是堆有序的二叉樹的最大節點。

堆的實現也有幾種今天我們主要利用的是用陣列來實現堆。這裡我們給出以下說明:

在乙個基於陣列的堆中,位置k的節點的父節點位置為k/2,它的兩個子節點的位置分別是2k和2k+1,這樣我們就可以在不使用指標的情況下任意訪問堆中的節點。

堆的兩個主要演算法:

1、上浮:當節點大於父節點是,將該節點和父節點進行位置交換,保證堆的有序性。

2、下沉:當節點小於子節點時,將該節點與兩個子節點中相對大的節點進行位置交換。

了解到這我們基本可以建立起乙個優先佇列了

insert:插入乙個元素利用上浮操作,交換新插入的節點和舊節點,保證堆的有序性,

del:刪除最大元素後,將陣列中的最後乙個元素移動到堆頂,然後利用下浮操作保證堆的有序性

至此 我們就描述了優先佇列主要操作的步驟。

我們可以把任意乙個優先佇列變為每乙個排序的方式,將所有元素插入乙個小定堆中,然後不斷的刪除堆頂元素,並且輸出,其輸出結果就是排序後的結果。這種排序方式就是堆排序。

堆排序可以分為兩個階段

1、構造堆:

堆的構造我們可以用下沉的方式,對陣列前1/2的元素做下沉操作,得到的就是乙個有序的堆。  時間複雜度為n

2、調整堆(插入刪除後 為保證堆的有序性需要對其進行調整)

堆的大部分操作時在第二階段完成的。這裡我們講堆頂的最大元素刪除,然後將陣列最後乙個元素放到隊定,然後執行下沉操作,直到堆有序。時間複雜度logn

不斷重複第二步驟即可完成堆排序。時間複雜度 nlogn

問題:假設有三個檔案 m1txt  ,m2.txt m3.txt  每個檔案分別存放了n個字元,且每個檔案的字串行是有序的。要求對這三個檔案的字元合併排序

應用該該問題的最優資料結構是最小索引優先佇列

最小優先佇列,詳細**見附件。

這裡介紹一下為什麼用索引優先佇列,而不直接用佇列,因為索引優先佇列,在insert的時候能用索引在標識插入的資料是哪個檔案的,在刪除的時候,增補的資料一定是要從刪除的檔案中去取。

這個問題例子請移步

堆在這種降低了查詢的複雜度,所以效能更高一些。

堆排序與優先佇列

說到堆就必須要說二叉樹,二叉樹指每個節點最多只能包含兩個子節點的樹。二叉樹常用的實現為二叉搜尋樹 binarysearchtree 和二叉堆 binaryheap 這裡不再對樹的概念進行贅述,有需求的自行google,二叉堆其實對應著一棵完全二叉樹,最後一層除外。因此使得乙個堆可以利用陣列來儲存,二...

優先佇列 堆排序

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

堆排序 優先佇列

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