Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのヒープソートとは何ですか?


ヒープソートは、バイナリヒープデータ構造に基づくソート手法です。ヒープソートを続行するには、バイナリツリーとバイナリヒープに精通している必要があります。

完全な二分木とは何ですか?

完全な二分木は、最後のレベルを除くすべてのレベルが完全に満たされているツリーデータ構造です。最後のレベルは左側から入力する必要があります。

バイナリヒープとは何ですか?

バイナリヒープは、バイナリツリーの特殊なケースです。バイナリヒープには2つのタイプがあります-

  • 最大ヒープ-各レベルの親ノードは、その子ノードよりも大きくなっています。

  • 最小ヒープ-各レベルの親ノードは、その子ノードよりも小さいです。

完全な二分木の配列表現

スペース効率が高いため、バイナリヒープは配列として表すことができます。親ノードがインデックスIに格納されている場合、左の子は2 * i + 1で計算でき、右の子は2 * i+2で計算できます。インデックスは0から始まると仮定します。

ヒープソートアルゴリズム

  • 完全なバイナリツリーから最大ヒープを構築します。

  • ルートを削除してヒープ内の最後の要素に置き換え、ヒープのサイズを1つ減らして、残りのノードから最大ヒープを再度構築します。

  • ノードが1つだけになるまで、手順2を繰り返します。

完全なバイナリツリーから最大ヒープを構築する

これは、2つの子ノードがルートと比較される完全なバイナリツリーから最大ヒープを構築するためのコードです。 Larger要素がルートでない場合は、大きい要素をルートと交換します。これは再帰的な手順です。子ノードよりも小さい現在のルートは、正しい位置に到達しない限り、下位のサブツリーと継続的に比較されます。

次のコードは、基本的に並べ替える配列である完全なバイナリツリーから最大ヒープを構築します。

def heapify(arr, n, i):
   # Find largest among root and children
   largest = i
   l = 2 * i + 1
   r = 2 * i + 2
   if l < n and arr[i] < arr[l]:
      largest = l
   if r < n and arr[largest] < arr[r]:
      largest = r
   # If root is not largest, swap with largest and continue heapifying
   if largest != i:
      arr[i], arr[largest] = arr[largest], arr[i]
      heapify(arr, n, largest)

ヒープソート

現時点では、最大ヒープがあります。次に、次のことを行う必要があります。

  • ルートをヒープの最後の要素と交換します。

  • ヒープのサイズを1つ減らします(これは、最大の要素が最後の位置に到達したことを意味します。その要素を考慮する必要はありません)。

  • 最後の要素を除いて最大ヒープを再構築します。

  • 要素が1つだけ残るまで、上記の手順を繰り返します。

for i in range(n-1, 0, -1):
   # Swap
   arr[i], arr[0] = arr[0], arr[i]

   # Heapify root element
   heapify(arr, i, 0)

Pythonでのヒープソートの完全なプログラムは次のとおりです-

def heapify(arr, n, i):
   # Find largest among root and children
   largest = i
   l = 2 * i + 1
   r = 2 * i + 2
   if l < n and arr[i] < arr[l]:
      largest = l
   if r < n and arr[largest] < arr[r]:
      largest = r
   # If root is not largest, swap with largest and continue heapifying
   if largest != i:
      arr[i], arr[largest] = arr[largest], arr[i]
      heapify(arr, n, largest)

def heapSort(arr):
   n = len(arr)
   # Build max heap
   for i in range(n//2, -1, -1):
      heapify(arr, n, i)
   for i in range(n-1, 0, -1):
      # Swap
      arr[i], arr[0] = arr[0], arr[i]
      # Heapify root element
      heapify(arr, i, 0)

arr = [1, 12, 9, 5, 6, 10]
heapSort(arr)
n = len(arr)
print("Sorted array is")
for i in range(n):
   print(arr[i], end=' ')

時間計算量-O(n logn)


  1. ヒープソート用のPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列が与えられたので、ヒープソートの概念を使用して配列を並べ替える必要があります。 ここでは、最大の要素を最後に配置します。これは、配列がソートされるまで繰り返されます。 それでは、以下の実装のソリューションを見てみましょう- 例 # heapify def heapify(arr, n, i):    largest = i # largest value    l = 2 * i + 1 # left    r = 2 * i + 2 #

  2. Pythonプログラムでの選択ソート

    この記事では、Python3.xでの選択ソートとその実装について学習します。またはそれ以前。 選択ソート アルゴリズムでは、配列は、ソートされていない部分から最小要素を再帰的に見つけて、それを先頭に挿入することによってソートされます。特定の配列での選択ソートの実行中に、2つのサブ配列が形成されます。 すでに並べ替えられているサブ配列。 ソートされていないサブアレイ。 選択ソートを繰り返すたびに、ソートされていないサブアレイの最小要素がポップされ、ソートされたサブアレイに挿入されます。 アルゴリズムの視覚的表現を見てみましょう- それでは、アルゴリズムの実装を見てみましょう-