Python でバイナリ ヒープとヒープ ソートを実装するコード例

黄舟
リリース: 2017-10-02 19:40:45
オリジナル
1639 人が閲覧しました

以下のエディターは、Python でバイナリ ヒープとヒープ ソートを実装する例を示します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターに従って、ヒープを見てみましょう。ヒープ内のデータ ストレージは特定のヒープ順序を満たしています。ヒープ ソートは選択ソートであり、そのアルゴリズムの複雑さと時間の計算量は他のソート アルゴリズムに比べて大きな利点があります。

ヒープは、大きな頭のヒープと小さな頭のヒープに分けられます。大きな頭のヒープの最初の要素は、子ノードを持つ各親ノードのデータ値よりも大きくなります。その子ノードは大きいです。 Xiaotou Duiはその逆です。

ツリーヒープを構築するアルゴリズムプロセスを簡単に説明します: 位置N/2の配列データを検索し、この位置から開始して、ノードの左側の子ノードのインデックスを検索し、最初に比較しますこの結果 点の下にある子ノードのうち最大のものを見つけ、最大の子ノードのインデックスを左側の子ノードに割り当て、最大の子ノードと親ノードを比較します。親ノードより大きい場合は、親ノードはデータを交換します。もちろん、実装については先ほど簡単に説明しましたが、このプロセスではノードが存在しない状況も考慮する必要があります。

コードを見てください:

# 构建二叉堆 
def binaryHeap(arr, lenth, m): 
 temp = arr[m] # 当前结点的值 
 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("二叉堆的物理顺序为:") 
 print(arr) # 输出二叉堆的物理顺序 
 
 
if __name__ == &#39;__main__&#39;: 
 arr = [2, 87, 39, 49, 34, 62, 53, 6, 44, 98] 
 
 heapsort(arr, len(arr))
ログイン後にコピー

ヒープソートプロセスは、最後のノードをシーケンスの最初のノードと比較して交換します:

# 构建二叉堆
def binaryHeap(arr, lenth, m):
  temp = arr[m] # 当前结点的值
  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("二叉堆的物理顺序为:")
  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__ == &#39;__main__&#39;:
  arr = [2, 87, 39, 49, 34, 62, 53, 6, 44, 98]

  heapsort(arr, len(arr))

  print("堆排序后的物理顺序")
  print(arr) # 输出经过堆排序之后的物理顺序

  data = pop(arr)
  print(data)

  print(arr)
ログイン後にコピー

Pythonはヒープモジュールをカプセル化します。このモジュールはプライオリティキューを非常に効率的に実装できます

import heapq


class Item:
  def __init__(self, name):
    self.name = name

  def __repr__(self):
    return &#39;Item({!r})&#39;.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)) # 存入一个三元组
    self._index += 1

  def pop(self):
    return heapq.heappop(self._queue)[-1] # 逆序输出


if __name__ == &#39;__main__&#39;:
  p = PriorityQueue()
  p.push(Item(&#39;foo&#39;), 1)
  p.push(Item(&#39;bar&#39;), 5)
  p.push(Item(&#39;spam&#39;), 4)
  p.push(Item(&#39;grok&#39;), 1)

  print(p.pop())
  print(p.pop())
ログイン後にコピー

詳しくはheapq公式サイトをご覧ください

以上がPython でバイナリ ヒープとヒープ ソートを実装するコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート