堆排序:是指利用堆這種資料結構所涉及的一種排序演算法。
堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子節點的鍵值或索引總是大於或者小於它的父節點
時間複雜度平均為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 要弄清楚堆排序,就要先了解下二叉堆這種資料結構。本文不打算完全講述二叉堆的所有操作,而是著重講述堆排序中要用到的操作。比如我們建堆的時候可以採用堆的插入操作 將元素插入到適當的位置,使新的序列仍符合堆的定義 將元素乙個乙...