堆排序(最大堆)以及最優佇列的實現

2021-10-24 03:28:52 字數 2176 閱讀 7495

堆排序(最大堆)以及最優佇列的實現

#include

#include

template

<

typename t>

class

priority_queue

inline std::size_t right

(std::size_t i)

void

max_heaplfy

(std::vector

&a,std::size_t i)

;bool flag

;public

:priority_queue

(std::vector

&s):

array

(s);

void

build_heap()

;void

print()

const

; t&

maximum()

;void

heap_insert

(t data)

; t heap_extract_max()

;void

heap_update

(std::size_t index,t newdata)

;void

heap_sort()

;};template

<

typename t>

inline std::size_t priority_queue

::parent

(std::size_t i)

else

if(i%2==

0)else

if(i%2==

1)return0;

}//保持最大堆性質的函式

template

<

typename t>

void priority_queue

::max_heaplfy

(std::vector

&a,std::size_t i);if

(leftsize()

&&a[left]

>a[i]

)else

if(rightsize()

&&a[right]

>a[largest])if

(largest!=i)

}//構建最大堆

template

<

typename t>

void priority_queue

::build_heap()

flag=

true;}

//列印函式

template

<

typename t>

void priority_queue

::print()

const

std::cout<}//返回佇列中最大的那乙個關鍵字

template

<

typename t>

t& priority_queue

::maximum()

//基於最大堆的最優佇列的插入

template

<

typename t>

void priority_queue

::heap_insert

(t data)

}//去掉佇列中的最大元素並進行返回

template

<

typename t>

t priority_queue

::heap_extract_max()

//修改指標為index的資料

template

<

typename t>

void priority_queue

::heap_update

(std::size_t index,t newdata)

else}}

//對這個最大堆進行排序輸出

template

<

typename t>

void priority_queue

::heap_sort()

else

if(flag==

true

) std::cout<<}}

最大堆實現堆排序

堆排序 這裡使用的是最大堆 思想 1 將當前的堆轉換成最大堆 從最大的非葉子結點開始,1 判斷根結點和左右結點的大小交換相互的位置,使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複 1 操作,直到根結點後再去下乙個非葉子結點,直到根結點 2 轉成最大堆後,每次就將第乙個結點互最後乙個...

最大堆 排序

解除安裝最前面,下面的所有討論都是基於二叉堆 一 什麼是堆 堆是乙個陣列結構,可以看著為一顆完全二叉樹,把這顆完全二叉樹按層從上到下,每層從左至右編序號,每個序號所對應的元素即為陣列中該序號的元素 該樹出最後一層以外每一層都排滿,最後一層從左至右,先左孩子再右孩子排列,如果有父節點沒有排滿孩子 無孩...

最大堆排序

其實堆排序就是對二叉樹的一種操作,使得二叉樹的左右孩子 節點都小於父節點。我使用的是陣列的實現方式,parent i return i 2 i的父節點下標,left i return 2 i i的左子節點 right i return 2 i 1 i的右子節點.以上均為陣列元素的標號位置,在訪問元素...