python3堆排序 python 堆排序

2021-10-11 20:16:01 字數 1220 閱讀 3075

堆排序

堆排序(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向下取整 若將和此序列對應的一維陣列 即以一...