だから私は自分自身を少し掘り下げました、そしてこの結果は実際にはかなり最近のようです!ヒープソート自体は1964年に発明されましたが、私が見つけた最初の下限の証明は1992年のものです。
正式な下限の証明は、SchafferとSedgewickの「TheAnalysisofHeapsort」の論文によるものです。これは、技術的な詳細の一部を省略した、少し言い換えたバージョンの証明です。
まず、あるkに対してn = 2 k -1であると仮定します。これにより、完全なバイナリヒープが保証されます。このケースを個別に処理する方法については、後で説明します。2 k -1の要素があるため、ヒープソートの最初のパスは、Θ(n)で高さkのヒープを構築します。ここで、このヒープからのデキューの前半を考えてみましょう。これにより、2k-1が削除されます。ヒープからのノード。最初の重要な観察は、開始ヒープを取得し、実際にデキューされるすべてのノードをここでマークすると、それらはヒープのサブツリーを形成することです(つまり、デキューされるすべてのノードには、デキューされる親があります)。これが当てはまらない場合は、ノード自体がデキューされたにもかかわらず、(大きい)親がデキューされなかったノードが存在するため、これを確認できます。これは、値の順序が正しくないことを意味します。
ここで、このツリーのノードがヒープ全体にどのように分散されているかを考えてみましょう。ヒープのレベルに0、1、2、...、k-1のラベルを付けると、レベル0、1、2、...、k-2にこれらのノードがいくつか存在します(つまり、ツリーの最下位レベルを除くすべて)。これらのノードがヒープからデキューされるためには、ルートまでスワップアップする必要があり、一度に1レベルだけスワップアップされます。これは、ヒープソートの実行時間を下限にする1つの方法は、これらすべての値をルートに上げるために必要なスワップの数を数えることであることを意味します。実際、それがまさに私たちがやろうとしていることです。
答える必要のある最初の質問は、ヒープの最下位レベルにない最大の2k-1ノードの数です。矛盾により、これが2k-2以下であることを示すことができます。ヒープの最下位レベルに少なくとも2k-2 +1の最大ノードがあるとします。次に、これらのノードの各親は、レベルk-2の大きなノードである必要があります。最良の場合でも、これは、レベルk-2に少なくとも2つのk-3 +1つの大きなノードが存在する必要があることを意味します。レベルk-3などに少なくとも2つのk-4 +1つの大きなノードがあることを確認します。これらのノードすべてを合計すると、2 k-2 + 2 k-3 + 2k-4 +があることがわかります。 ... + 20 +kラージノード。ただし、この値は厳密に2 k-1を超えており、ここでは2k-1ノードのみを使用しているという事実と矛盾しています。
さて...これで、最下層に最大2k-2の大きなノードがあることがわかりました。これは、最初のk-2層に少なくとも2k-2の大きなノードが必要であることを意味します。ここで、これらのノードすべてにわたって、そのノードからルートまでの距離の合計はどれくらいかを尋ねます。ええと、完全なヒープのどこかに2つのk-2ノードが配置されている場合、それらの最大2 k-3が最初のk-3レベルにある可能性があるため、少なくとも2k- 2-2k-があります。レベルk-2の3 =2 k-3ヘビーノード。したがって、実行する必要のあるスワップの総数は、少なくとも(k-2)2k-3です。n = 2kなので-1、k =Θ(lgn)であるため、この値は必要に応じてΘ(n lg n)になります。