python演算法9 12 堆排序

2021-08-28 01:18:54 字數 1451 閱讀 8196

# 堆排序,利用堆進行排序

# 堆是一種完全二叉樹,分為大根堆、小根堆

# 大根堆:每個父節點大於等於子節點;小根堆:每個父節點小於等於子節點

# 演算法原理(公升序):

# 1.構造大根堆

# 2.將堆頂點與最右下進行交換(最值右移)

# 3.除最右下值(最大值)外,構造大根堆

# 4.重複實現公升序

# 實現過程:

#參考

import random

def max_heapify(heap,heapsize,root): #在堆中做結構調整使得父節點的值大於子節點

left = 2*root + 1

right = left + 1

larger = root

if left < heapsize and heap[larger] < heap[left]:

larger = left

if right < heapsize and heap[larger] < heap[right]:

larger = right

if larger != root: #如果做了堆調整則larger的值等於左節點或者右節點的,這個時候做對調值操作

heap[larger],heap[root] = heap[root],heap[larger]

max_heapify(heap, heapsize, larger)

def build_max_heap(heap): #構造乙個堆,將堆中所有資料重新排序

heapsize = len(heap) #將堆的長度當獨拿出來方便

for i in range((heapsize -2)//2,-1,-1):#從後往前出數

max_heapify(heap,heapsize,i)

def heapsort(heap):

build_max_heap(heap)

for i in range(len(heap)-1,-1,-1): #將根節點取出與最後一位做對調,對前面len-1個節點繼續進行對調整過程。

heap[0],heap[i] = heap[i],heap[0]

max_heapify(heap, i, 0)

return heap

if __name__ == '__main__':

range = 100

length = 11

list = random.sample(range(range), length) # 在指定序列中隨機獲取指定長度片段

print('before sort:', list)

heapsort(list)

print('after sort:', list)

演算法 堆排序(堆)

使用情形 插入乙個數 求集合當中的最小值 刪除最小值 刪除任意乙個元素 修改任意乙個元素 用一維陣列儲存二叉樹,左兒子在陣列中為根節點在陣列中的位置的2倍,右兒子在陣列中為根節點在陣列中的位置的二倍加一。求當前堆的最小值 void down int u 輸入乙個長度為n的整數數列,從小到大輸出前m小...

python3堆排序 python 堆排序

堆排序 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點 但是不保證所有左子樹比右子樹小反之亦然 堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個...

排序演算法(六) 堆排序

堆定義 堆是一種完全二叉樹,每個結點都大於等於其子結點的稱為大頂堆,每個結點都小於等於其子結點的稱為小頂堆。堆排序定義 將待排序的序列構造成乙個大頂堆,此時堆頂是最大值,將其移到序列最末端後,剩餘的序列重新構造乙個大頂堆,如此反覆直到得到乙個有序序列。時間複雜度 o nlogn 實現 public ...