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 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的...