最大堆的實現及堆排序

2021-10-04 13:40:18 字數 3416 閱讀 7157

b站浙大資料結構課程-堆的原理與實現

堆排序演算法說明

最大堆,每個節點都比其左右子節點大。且是完全二叉樹

從根節點到任意節點路徑上結點序列的有序性。

堆排序演算法說明

將待排序序列構建成乙個堆 h[0……n-1],根據(公升序降序需求)選擇大頂堆或小頂堆;

把堆首(最大值)和堆尾互換;

把堆的尺寸縮小 1,並呼叫 shift_down(0),目的是把新的陣列頂端資料調整到相應位置;

重複步驟 2,直到堆的尺寸為 1。

//完全二叉樹,根節點序號為1,序號按層級從左往右增加

//乙個節點為i,則其父節點序號為 i/2, 左子節點為 2*i, 右子節點為 2*i+1

// 9[1]

// / \

// 8[2] 7[3]

// / \ / \

// 6[4] 5[5] 4[6] 3[7]

class

maxheap

;maxheap::

maxheap

(int maxsize)

:arr

(maxsize+1)

void maxheap::

insert

(int element)

int i =

++size;

for(

; arr[i/2]

) arr[i]

= element;

}int maxheap::

popmax()

int maxitem = arr[1]

;//記錄最大元素

int tmp = arr[size--];

//取出最尾元素,並 對 size減一

int parent, child;

for(parent=

1; parent*

2<=size/*存在左子節點*/

; parent=child)

if(tmp

)else

} arr[parent]

= tmp;

return maxitem;

}maxheap* maxheap::

initmaxheap1

(vector<

int>

& nums)

return heap;

}maxheap* maxheap::

initmaxheap2

(vector<

int>

& nums)

//從最後乙個有子節點的節點開始,即 size/2, ~ 1

for(

int i=heap-

>size/

2; i>=1;

--i)

return heap;

}void maxheap::

_adjust

(maxheap* pheap,

int index)

}//平均時間複雜度 最好情況 最壞情況 空間複雜度 排序方式 穩定

// nlogn nlogn nlogn 1 in no

vector<

int> maxheap::

getsortedvec()

vector<

int>

result

(++arr.

begin()

, arr.

end())

;//返回arr[1,size]

java 實現最大堆及堆排序

從0開始的最大堆 通過插入排序的思想進行了優化 實現了增刪改查 從0開始的最大堆 通過插入排序的思想進行了優化 實現了增刪改查 author 葉葉葉 param public class maxheap public maxheap int capacity public int size publ...

最大堆實現堆排序

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

堆排序原理及演算法實現(最大堆)

堆排序 堆排序是利用堆的性質進行的一種選擇排序。下面先討論一下堆。1.堆堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的...