使用陣列來模擬堆。
由於是乙個滿二叉樹
左孩子使用nums[2i+1]模擬
右孩子使用nums[2i+2]模擬
堆排序的基本思路為:
a.將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;
b.將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;
c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。
#始終保持nums[i] > nums[2i+1] and nums[i] > nums[2i+2]
defheapify
(nums, n, i)
: largest = i
l =2* i +
1 r =
2* i +
2if l < n and nums[l]
> nums[largest]
: largest = l
if r < n and nums[r]
> nums[largest]
: largest = r
if largest != i:
nums[i]
, nums[largest]
= nums[largest]
, nums[i]
heapify(nums, n, largest)
因為nums[0]的元素始終是最大的,nums[0] > nums[1 or 2] 而nums[1] > nums[3 or 4]以此類推和遞迴def
heapsort
(nums)
: i =
len(nums)//2
#建立堆,使得nums[i] > nums[2i+1] and nums[i] > nums[2i+2]
while i >=0:
heapify(nums,
len(nums)
, i)
i -=
1for i in
range
(len
(nums)-1
,-1,
-1):
nums[0]
, nums[i]
= nums[i]
, nums[0]
#最大的換到末尾,然後對換到0的數字繼續構造堆,這個時候末尾的元素就不考慮了
heapify(nums, i,
0)
所以每次只需要將0後沉,然後從0的位置開始調整堆即可。
排序演算法 堆排序演算法實現及分析
堆排序 heap sort 就來利用堆 假設利用大頂堆 進行排序的方法。它的基本思想是,將待排序的序列構成乙個大頂堆。此時,整個序列的最大值就是堆頂的根結點。將它移走 其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值 然後將剩餘的n 1個序列重新構造成乙個堆,這樣就會得到n個元素中的次小值...
排序演算法之堆排序及Java實現
選擇排序 直接選擇排序,堆排序 交換排序 氣泡排序,快速排序 插入排序 直接插入排序,希爾排序 歸併排序 桶式排序 基數排序 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序。堆是具有以下性質的完全二叉樹 每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆 或者每個結點的值...
堆排序演算法實現
include define true 1 define false 0 typedef struct recordtype void sift recordtype r,int k,int m 調整堆 r i t void crt heap recordtype r,int length 建立堆 ...