堆排序
堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點(但是不保證所有左子樹比右子樹小反之亦然)。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:
大頂堆:每個節點的值都大於或等於其子節點的值,在堆排序演算法中用於公升序排列;
小頂堆:每個節點的值都小於或等於其子節點的值,在堆排序演算法中用於降序排列;
堆排序的平均時間複雜度為 ο(nlogn)。
演算法步驟
建立乙個堆 h[0……n-1];(**對非葉子節點的子節點進行調節,構建堆**)
把堆首(最大值)和堆尾互換;
把堆的尺寸縮小 1,並呼叫 shift_down(0),目的是把新的陣列頂端資料調整到相應位置;
重複步驟 2,直到堆的尺寸為 1。
python **實現
def buildmaxheap(arr):
import math
for i in range(math.floor(len(arr)/2),-1,-1):#構建堆由下往上構建所以用-1
heapify(arr,i)
def heapify(arr, i):
left = 2*i+1
right = 2*i+2
largest = i
if left < arrlen and arr[left] > arr[largest]:
largest = left
if right < arrlen and arr[right] > arr[largest]:
largest = right
if largest != i:
swap(arr, i, largest)
heapify(arr, largest)
def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i]
def heapsort(arr):
global arrlen
arrlen = len(arr)
buildmaxheap(arr)
for i in range(len(arr)-1,0,-1):
swap(arr,0,i)
arrlen -=1 #每次踢掉求出的最大值
heapify(arr, 0)
return arr
堆排序python3實現
堆排序的思想 先將無序陣列調整為大頂堆 小頂堆,然後將堆頂元素r0和最後乙個孩子節點rn交換位置,此時r0 rn 1是無序的,rn是有序的,繼續迭代,將r0 rn 1調整為大頂堆 小頂堆,然後將堆頂元素r0和rn 1交換位置,迭代到堆中只剩下乙個元素為止 def heapfiy nums,n,i l...
排序演算法 3,堆排序
include inth 15 堆陣列 h 0 不在計算範圍內 不是堆裡的元素 請忽略 intn 14 堆元素個數 交換兩個數 voidswap int x,int y 向下調整下標為 i的節點 voidsiftdown inti 否則該節點已滿足最小堆要求 跳出迴圈 elsebreak 每次生成最...
演算法 3 堆排序
堆排序是一種選擇排序,其時間複雜度為o nlogn 堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 其中i 1,2,n 2向下取整 若將和此序列對應的一維陣列 即以一...