堆排序 優先佇列

2022-08-27 08:27:09 字數 2195 閱讀 2441

1.堆排序

a.堆的定義

n個元素序列當且僅當滿足以下關係時,稱之為堆。

ki<=k2i且ki<=k2i+1

(小根堆)

ki>=k2i且ki>=k2i+1 (大根堆)

以下針對最大堆

b.維護堆的性質

max-heapify通過讓a[i]的值在最大堆中"逐級下降"(a[i]的值小於其左右孩子的值時),從而使得以i為根結點的子樹重新遵循最大堆性質.

max-heapify(a,i)

l =left(i)

r =right(i)

if l <= a.heap-size and a[l] >a[i]

largest =l

else largest =i

if r <= a.heap-size and a[r] >a[largest]

largest =r

iflargest ≠ i

swap(a[i],a[largest])

max-heapify(a,largest)

時間複雜度:o(lgn)

c.建堆

子陣列a(n/2+1..n)中的元素都是樹的葉子結點,每個葉結點都可以看成只包含乙個元素的堆.build-max-heap對樹中的其他結點都呼叫一次max-heapify.

build-max-heap(a)

a.heap-size =a.length

for i = a.length/2 downto 1

max-heapify(a,i)

時間複雜度:o(n)

d.堆排序

heap-sort(a)

build-max-heap(a)

for i = a.length downto 2

swap(a[

1],a[i])

a.heap-size = a.heap-size -1

max-heapify(a,1)

時間複雜度:o(n*lgn)

2.優先佇列

具體的演算法就不談了,來看下c++中的優先佇列如何使用.

std::priority_queue 

defined

in header template

<

class

t,

class container = std::vector,

class compare = std::less> class priority_queue;

預設是最大優先佇列.可以提供compare引數來實現最小優先佇列.

compare = greater
example:

#include #include 

#include

#include

template

void print_queue(t&q)

std::cout

<< '\n'

;}int

main() )

q.push(n);

print_queue(q);

std::priority_queue

, std::greater >q2;

for(int n : )

q2.push(n);

print_queue(q2);

}

view code

對於自定義型別

如果過載了比較運算子

priority_queueq//

最大優先佇列

priority_queue,greater> q//

最小優先佇列

如果沒有過載比較運算子,則需要提供乙個comparator傳給compare引數

//

最大優先佇列比較器

struct

comp

};//

最小優先佇列比較器

struct

comp

};//

使用priority_queue,comp> q

參考:1,2,3

優先佇列 堆排序

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

堆排序 最大優先佇列

優先佇列支援的操作 insert maximum,extract,increasekey,include include include define number 100 define num 6 using namespace std struct heaptype void exchange ...

優先佇列與堆排序

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