堆排序演算法及實現

2021-09-12 10:17:57 字數 1297 閱讀 7951

使用陣列來模擬堆。

由於是乙個滿二叉樹

左孩子使用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)

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)

因為nums[0]的元素始終是最大的,nums[0] > nums[1 or 2] 而nums[1] > nums[3 or 4]以此類推和遞迴

所以每次只需要將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 建立堆 ...