用python實現堆排序

2021-08-17 14:27:16 字數 2150 閱讀 4470

一、概念

將剩餘的堆繼續調整為最大堆,具體過程在第二塊有介紹,以遞迴實現 

剩餘部分調整為最大堆後,再次將堆頂的最大數取出,再將剩餘部分調整為最大堆,這個過程持續到剩餘數只有乙個時結束

#_*_coding:utf-8_*_

__author__ = 'alex li'

import time,random

defsift_down

(arr, node, end):

root = node

#print(root,2*root+1,end)

while

true:

# 從root開始對最大堆調整

child = 2 * root +1

#left child

if child > end:

#print('break',)

break

print("v:",root,arr[root],child,arr[child])

print(arr)

# 找出兩個child中交大的乙個

if child + 1

<= end and arr[child] < arr[child + 1]: #如果左邊小於右邊

child += 1

#設定右邊為大

if arr[root] < arr[child]:

# 最大堆小於較大的child, 交換順序

tmp = arr[root]

arr[root] = arr[child]

arr[child]= tmp

# 正在調整的節點設定為root

#print("less1:", arr[root],arr[child],root,child)

root = child #

#[3, 4, 7, 8, 9, 11, 13, 15, 16, 21, 22, 29]

#print("less2:", arr[root],arr[child],root,child)

else:

# 無需調整的時候, 退出

break

#print(arr)

print('-------------')

defheap_sort

(arr):

# 從最後乙個有子節點的孩子還是調整最大堆

first = len(arr) // 2 -1

for i in range(first, -1, -1):

sift_down(arr, i, len(arr) - 1)

#[29, 22, 16, 9, 15, 21, 3, 13, 8, 7, 4, 11]

print('--------end---',arr)

# 將最大的放到堆的最後乙個, 堆-1, 繼續調整排序

for end in range(len(arr) -1, 0, -1):

arr[0], arr[end] = arr[end], arr[0]

sift_down(arr, 0, end - 1)

#print(arr)

defmain

():# [7, 95, 73, 65, 60, 77, 28, 62, 43]

# [3, 1, 4, 9, 6, 7, 5, 8, 2, 10]

#l = [3, 1, 4, 9, 6, 7, 5, 8, 2, 10]

#l = [16,9,21,13,4,11,3,22,8,7,15,27,0]

array = [16,9,21,13,4,11,3,22,8,7,15,29]

#array =

#for i in range(2,5000):

# #print(i)

print(array)

start_t = time.time()

heap_sort(array)

end_t = time.time()

print("cost:",end_t -start_t)

print(array)

#print(l)

#heap_sort(l)

#print(l)

if __name__ == "__main__":

main()

用C 實現堆排序

極大堆 排序後從小到大 是具有以下性質的完全二叉樹,每個結點的值都大於等於左右結點的值 下面是使用極大堆的方式進行排序,使用極小堆的排序原理差不多。include using namespace std void heapadjust int a,int s,int n void heapsort ...

用C實現堆排序

堆排序 heapsort 是指利用堆積樹 堆 這種 資料結構所設計的一種 排序演算法,它是選擇排序的一種。可以利用 陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是 完全二叉樹。本次堆排序利用了小根堆堆頂記錄的 關鍵字最小這一特徵,使得在當前無序區中選取最小關鍵字的記錄變得簡單。用小根堆排...

Python實現堆排序

usr bin env python coding utf 8 堆排序 class heap object 求給定下標i的父節點下標 defparent self,i if i 2 0 return i 2 1 else return i 2 求給定下標i的左孩子下標 defleft self,i ...