演算法系列7 堆排序

2021-10-06 16:32:22 字數 2329 閱讀 6841

堆排序:是指利用堆這種資料結構所涉及的一種排序演算法。

堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子節點的鍵值或索引總是大於或者小於它的父節點

時間複雜度平均為o(nlog2n),最好為o(nlog2n),最壞o(nlog2n),空間複雜度為o(1),不穩定排序

d0 =[99

,5,36

,7,22

,17,46

,12,2

,19,25

,28,1

,92]def

sort_max

(data)

:# 直接冒泡一下吧,小到大

for i in

range

(len

(data)-1

):for j in

range

(len

(data)-1

):if data[j]

> data[j +1]

: data[j]

, data[j +1]

= data[j +1]

, data[j]

return data

defheap_min

(data,

type):

index =0if

nottype

:for i in

range

(len

(data[1:

])):

if data[index]

> data[i+1]

: index = i+

1 data[0]

,data[index]

= data[index]

,data[0]

return data

else

:for i in

range

(len

(data[1:

])):

if data[index]

< data[i+1]

: index = i+

1 data[0]

,data[index]

= data[index]

,data[0]

return data

# d0 = [3,2,1,10,3]

# print(heap_min(d0,1))

# print(heap_min(d0,0))

import numpy as np

defheap_adj

(data,

type):

# data 原始堆,type=1最大堆,type=0最小堆

length =

len(data)

floor =

int(np.log2(length)

)for i in

range

(floor,0,

-1):

# 3(7 6 5 4)-2(3 2)-1(1)

for j in

range(2

** floor -1,

2**(floor - i)-1

,-1)

:# print(i,j) # j-1 為當前父節點

d_mid =

[data[j -1]

]# j = 7,j-1 =6 index

if j *

2<= length:

# 142-

1])if j *2+

1<= length:2]

) d_mid = heap_min(d_mid,

type)if

len(d_mid)==2

: data[j -1]

, data[j *2-

1]= d_mid[0]

, d_mid[1]

elif

len(d_mid)==3

: data[j -1]

, data[j *2-

1], data[j *2]

= d_mid[0]

, d_mid[1]

, d_mid[2]

return data

d1 =

for i in

range

(len

(d0)):

data = heap_adj(d0,0)

0])del d0[0]

print

(d1)

經典排序演算法系列7 堆與堆排序

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...

演算法系列之一 堆排序

前序 二叉 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。樹中每個節點與陣列中存放該節點值的那個元素對應。樹的每一層都是填滿的,最後一層除外。樹的根為a 1 在這裡是從1開始的,也可以從0開始 給定了某個節點的下標i,其父節點為i 2,左二子為2 i,右兒子為2 i 1。二叉堆滿足二個特性 ...

排序演算法 7 堆排序

參考文章 前言 堆排序 快速排序 歸併排序的平均時間複雜度都為o n logn 要弄清楚堆排序,就要先了解下二叉堆這種資料結構。本文不打算完全講述二叉堆的所有操作,而是著重講述堆排序中要用到的操作。比如我們建堆的時候可以採用堆的插入操作 將元素插入到適當的位置,使新的序列仍符合堆的定義 將元素乙個乙...