以下のエディターは、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__ == '__main__': 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__ == '__main__': 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)
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)) # 存入一个三元组 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())
以上がPython でバイナリ ヒープとヒープ ソートを実装するコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。