程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python數據結構與算法4

編輯:Python

目錄

滿二叉樹

完全二叉樹

 堆的向下調整

 堆的排序過程

代碼實現

時間復雜度


滿二叉樹

如果二叉樹中除了葉子結點,每個結點的度都為 2,則此二叉樹稱為滿二叉樹。

完全二叉樹

如果二叉樹中除去最後一層節點為滿二叉樹,且最後一層的結點依次從左到右分布,則此二叉樹被稱為完全二叉樹。

1.必須是完全二叉樹
2.用數組實現
3.任一結點的值是其子樹所有結點的最大值或最小值

  • 大根堆:在完全二叉樹中,任何一個子樹的最大值都在這個子樹的根結點。
  • 小根堆:在完全二叉樹中,任何一個子樹的最小值都在這個子樹的根結點。

 堆的向下調整

節點的左右子樹都是堆,但自身不是堆的二叉樹才能向下調整,最終變成堆

 堆的排序過程

挨個出數:1、將帶列構造成一個大頂堆,根據大頂堆的性質,當前堆的根節點(堆頂)就是序列中最大的元素;2、將堆頂元素和最後一個元素交換,然後將剩下的節點重新構造成一個大頂堆;3、重復步驟2,如此反復,從第一次構建大頂堆開始,每一次構建,我們都能獲得一個序列的最大值,然後把它放到大頂堆的尾部。

代碼實現


def sift(li,low,high): #low根節點 high最後一個節點
i=low #i開始指向根節點
j=2*i+1 #j是左孩子
tmp=li[low] #堆頂的值
while j<=high:
if j+1<=high and li[j+1]>li[j]:
j=j+1
if li[j]>tmp:
li[i]=li[j]
i=j
j=2*i+1
else:
li[i]=tmp
break;
else :
li[i]=tmp
def heap_sort(li):
n=len(li)
for i in range((n-2)//2,-1,-1):
sift(li,i,n-1)
for i in range(n-1,-1,-1):
li[0],li[i]=li[i],li[0]
sift(li,0,i-1)
li= [i for i in range(10)]
import random
random.shuffle(li)
print(li)
heap_sort(li)
print(li)

時間復雜度

O(nlogn) 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved