python實現堆排序

2021-10-10 08:05:16 字數 1813 閱讀 4957

# 樹是一種資料結構

# 比如目錄結構

# 樹是一種可以遞迴定義的資料結構

# 樹是由n個節點組成的集合

# 比如n=0,那這是一顆空樹

# 如果n>0,那存在1個節點作為樹的根節點,其它節點可以分成m個集合,每個集合本身又是一棵樹

# 基本概念

# 二叉樹:樹的度不超過2的樹,每個節點最多只有兩個孩子節點,分別是左孩子節點和右孩子節點

# 滿二叉樹,每個層的節點都達到最大值

# 完全二叉樹:葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹

# 二叉樹的儲存方式

# 1,鏈式儲存方式

# 2.順序儲存方式 (用列表來儲存)

# 這裡介紹順序儲存方式

# 1.父節點和左孩子節點的編號下標 的下標關係 i=2i+1

# 2.父節點和右孩子節點的編號下標 的下標關係 i=2i+2

# 3.子節點找父節點 整除 int(i-1/2)

# 堆# 一種完全的二叉樹結構

# 大根堆:一顆完全二叉樹,滿足任一節點都比其他孩子節點大

# 小根堆:一顆完全二叉樹,滿足任一節點都比其他孩子節點小

# 堆排序:堆的向下調整性質

# 當根節點的左右子樹都是堆時,可以通過一次向下的調整來將其變換成乙個堆

# 堆排序過程

# 1.建立堆

# 2.得到堆頂元素,為最大頂

# 3.去掉堆頂,將堆最後乙個元素放到堆頂,此時可通過一次調整重新使堆有序。

# 4.堆頂元素為第二大元素

# 5.重複步驟3,知道堆變空

def sift(li,low,high):

""":param li: 列表

:param low: 堆的堆頂位置

:param high: 堆的最後乙個元素位置

:return:

"""i=low # i最開始指向根節點

j=2*i+1 # j開始是左孩子

tmp=li[low] # 把堆頂存起來

while j<=high: # 只要j位置有數,

if j+1<=high and li[j+1]>li[j]: # 如果右孩子比左孩子大,就把指標指向右邊

j=j+1

if li[j]>tmp:

li[i]=li[j]

i=jj=2*i+1 # 其實就是在當前基礎上向下看

else: # tmp更大

break

li[i]=tmp # 把tmp放到葉子節點上

def heap_sort(li):

n=len(li)

for i in range((n-2)//2,-1,-1): # 從n-1開始,倒著遍歷到0 (農村包圍城市)

# i表示建堆的時候調整的部分的根的下標

sift(li,i,n-1)

# 這列的high的作用就是樹的最後乙個數字,作用就是判別有沒有越界

# 建堆完成

print(li)

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

# i 指向堆的最後乙個位置

li[0],li[i]=li[i],li[0]

sift(li,0,i-1) # i-1 是新的high

print(li)

li=[i for i in range(100)]

import random

random.shuffle(li)

print(li)

heap_sort(li)

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 ...

堆排序python實現

因為部門頻繁調整,半年多時間直接上級換了三個,之前一起工作的同事被調離的時候大頭沒有放我過去,說還有業務讓我支撐,在這次調整大頭也被調走了,現在小團隊的業務已經不再重要,人也都是一些老弱病殘,並且技術路線也與部門大團隊完全不同,因此,最近想換乙個公司或者部門來尋找更好的發展。當我前幾天到公司另乙個部...

python 實現堆排序

原理 迴圈陣列,依次構建最大堆,構建完以後第乙個元素就為最大值 swap 到最後乙個位置,繼續對 陣列中 0 last 1 這個新陣列構建最大堆 依次類推 到最後構建完成 arr 55,67,89,12,4,6,2,34,33,12 arrlen int len arr 調整三個元素堆 defadj...