激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - python下實(shí)現(xiàn)二叉堆以及堆排序的示例

python下實(shí)現(xiàn)二叉堆以及堆排序的示例

2020-12-10 00:27又見(jiàn)阿郎 Python

下面小編就為大家?guī)?lái)一篇python下實(shí)現(xiàn)二叉堆以及堆排序的示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

堆是一種特殊的樹(shù)形結(jié)構(gòu), 堆中的數(shù)據(jù)存儲(chǔ)滿足一定的堆序。堆排序是一種選擇排序, 其算法復(fù)雜度, 時(shí)間復(fù)雜度相對(duì)于其他的排序算法都有很大的優(yōu)勢(shì)。

堆分為大頭堆和小頭堆, 正如其名, 大頭堆的第一個(gè)元素是最大的, 每個(gè)有子結(jié)點(diǎn)的父結(jié)點(diǎn), 其數(shù)據(jù)值都比其子結(jié)點(diǎn)的值要大。小頭堆則相反。

我大概講解下建一個(gè)樹(shù)形堆的算法過(guò)程:

找到N/2 位置的數(shù)組數(shù)據(jù), 從這個(gè)位置開(kāi)始, 找到該節(jié)點(diǎn)的左子結(jié)點(diǎn)的索引, 先比較這個(gè)結(jié)點(diǎn)的下的子結(jié)點(diǎn), 找到最大的那個(gè), 將最大的子結(jié)點(diǎn)的索引賦值給左子結(jié)點(diǎn), 然后將最大的子結(jié)點(diǎn)和父結(jié)點(diǎn)進(jìn)行對(duì)比, 如果比父結(jié)點(diǎn)大, 與父節(jié)點(diǎn)交換數(shù)據(jù)。當(dāng)然, 我只是大概說(shuō)了下實(shí)現(xiàn), 在此過(guò)程中, 還需要考慮結(jié)點(diǎn)不存在的情況。

看下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 構(gòu)建二叉堆
def binaryHeap(arr, lenth, m):
 temp = arr[m] # 當(dāng)前結(jié)點(diǎn)的值
 while(2*m+1 < lenth):
 lchild = 2*m+1
 if lchild != lenth - 1 and arr[lchild] < arr[lchild + 1]:
 lchild = lchild + 1
 if temp < arr[lchild]:
 arr[m] = arr[lchild]
 else:
 break
 m = lchild
 arr[m] = temp
 
 
def heapsort(arr, length):
 i = int(len(arr)/2)
 while(i >= 0):
 binaryHeap(arr, len(arr), i)
 i = i - 1
 
 print("二叉堆的物理順序?yàn)?")
 print(arr) # 輸出二叉堆的物理順序
 
 
if __name__ == '__main__':
 arr = [2, 87, 39, 49, 34, 62, 53, 6, 44, 98]
 
 heapsort(arr, len(arr))

堆排序過(guò)程就是依次將最后的結(jié)點(diǎn)與首個(gè)節(jié)點(diǎn)進(jìn)行對(duì)比交換:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 構(gòu)建二叉堆
def binaryHeap(arr, lenth, m):
  temp = arr[m] # 當(dāng)前結(jié)點(diǎn)的值
  while(2*m+1 < lenth):
    lchild = 2*m+1
    if lchild != lenth - 1 and arr[lchild] < arr[lchild + 1]:
      lchild = lchild + 1
    if temp < arr[lchild]:
      arr[m] = arr[lchild]
    else:
      break
    m = lchild
  arr[m] = temp
 
 
def heapsort(arr, length):
  i = int(len(arr)/2)
  while(i >= 0):
    binaryHeap(arr, len(arr), i)
    i = i - 1
 
  print("二叉堆的物理順序?yàn)?")
  print(arr) # 輸出二叉堆的物理順序
 
  i = length-1
  while(i > 0):
    arr[i], arr[0] = arr[0], arr[i] # 變量交換
    binaryHeap(arr, i, 0)
    i = i - 1560
 
 
def pop(arr):
  first = arr.pop(0)
  return first
 
 
if __name__ == '__main__':
  arr = [2, 87, 39, 49, 34, 62, 53, 6, 44, 98]
 
  heapsort(arr, len(arr))
 
  print("堆排序后的物理順序")
  print(arr) # 輸出經(jīng)過(guò)堆排序之后的物理順序
 
  data = pop(arr)
  print(data)
 
  print(arr)

python封裝了一個(gè)堆模塊, 我們使用該模塊可以很高效的實(shí)現(xiàn)一個(gè)優(yōu)先隊(duì)列

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import heapq
 
 
class Item:
  def __init__(self, name):
    self.name = name
 
  def __repr__(self):
    return 'Item({!r})'.format(self.name)
 
 
class PriorityQueue:
  def __init__(self):
    self._queue = []
    self._index = 0
 
  def push(self, item, priority):
    heapq.heappush(self._queue, (-priority, self._index, item)) # 存入一個(gè)三元組
    self._index += 1
 
  def pop(self):
    return heapq.heappop(self._queue)[-1] # 逆序輸出
 
 
if __name__ == '__main__':
  p = PriorityQueue()
  p.push(Item('foo'), 1)
  p.push(Item('bar'), 5)
  p.push(Item('spam'), 4)
  p.push(Item('grok'), 1)
 
  print(p.pop())
  print(p.pop())

具體請(qǐng)看heapq官網(wǎng)

以上這篇python下實(shí)現(xiàn)二叉堆以及堆排序的示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/zhiyong-ITNote/archive/2017/09/28/7608330.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91在线色视频 | 91精品国产91热久久久做人人 | 一级片免费观看 | 成人在线观看免费爱爱 | 久久91精品国产91久久yfo | 欧美性生活久久久 | 免费黄色在线观看网站 | 伦一区二区三区中文字幕v亚洲 | 综合网天天射 | 摸逼逼视频 | 免费a级黄色毛片 | 国内精品国产三级国产a久久 | 欧美a在线观看 | 中文字幕在线免费看 | 国产乱淫a∨片免费观看 | 成av在线 | 九九色精品 | 国产精品久久久久久238 | 成人福利软件 | 国产精品入口夜色视频大尺度 | 欧美18xxxx| 国产一区二区精彩视频 | 国产成人羞羞视频在线 | 久久久久91视频 | 男人的天堂毛片 | 九九热九九热 | 久久久tv | 免费视频99 | 中国av一级片 | 中国免费黄色 | 2021狠狠操 | 国产精品啪 | 爱唯侦察 国产合集 亚洲 | 欧美精品成人一区二区在线观看 | 国产午夜电影在线观看 | 久久久久一本一区二区青青蜜月 | 99爱视频在线观看 | 精品亚洲网站 | free台湾极品性hd | 国产精品99久久久久久久女警 | 国产成人精品免费视频大全最热 |