データ構造とアルゴリズムは省略 - スタックとヒープの並べ替え

ヒープ


コンセプト

  • ヒープは完全2分木です。
  • (以下)に等しいかまたはより大きいサブツリーの各ノードのためのヒープ必須値の各ノードの値。
  • 大小の屋根の上のヒープヒープ:ツリーの値と子ノードとの大小関係に応じて分かれています。

どのように達成するために

  • どの店に
    • バイナリツリーの完全なバイナリツリーのセクションでは、ストレージアレイの話しましたので、ヒープを格納するための配列を使用
  • どのような操作
    • 要素を挿入(O(logN個)) -アレイの端部が行われるに挿入されるまで、下からのスタック:スタックの最上部、比較から一枚ずつ交換満たされず、端部満たすために経路に沿って。
    • クラスヒープ{パブリック
        専用のint [] A; //配列、格納されたデータから添字1を開始する
        プライベート整数N; //が格納できるデータの最大数スタック
        プライベートint型の数を、既にスタックに格納されたデータの//数
      
        公共ヒープ(INT容量){ 
          新しい新しいINT = [容量+ 1]; 
          N-容量=; 
          COUNT = 0; 
        } 
      
        公共ボイドINSERT(INTデータ){ 
          IF(COUNT> = N-)のリターン; //充填
          ++カウント; 
          A [COUNT] =データ; 
          INT Iがカウント=; 
          ながら(I / 2> 0 && A [I]> A [I / 2]){//パイルアップの底から
            スワップ(I、I / 2); //スワップ()関数が動作するインデックスに2つのスイッチング素子を、私は私/ 2 
            iはI / 2 =; 
          } 
        } 
       }
      
    • ヒープ要素の上部を削除します(O(logN個)) -私たちは、ヒープの上部に最後のノードを入れ、その後、親と子ノードを比較するのと同じ方法を使用します。親子関係は、相互に交換、サイズのための2つのノードを満たしていないと、親と子ノード間の大小関係まで、満足するまで、このプロセスは、繰り返されます。これは、ヒープ方式の上から
    • ます。public void removeMax(){ 
        場合(カウント== 0)リターン-1; //堆中没有数据
        [1] [カウント] =。
        - カウント; 
        heapify(カウント、1); 
      } 
      
      プライベートボイドheapify(INT [] A、INT nは、INT I){//自上往下堆化
        しながら(TRUE){ 
          int型maxPos = I。
          IF(I * 2 <= N && [I] <[I * 2])maxPos = iが2 *; 
          (I * 2 + 1 <= N && [maxPos] <[I * 2 + 1])maxPos = I * 2 + 1であれば、
          ブレーク(maxPosは、私を==)であれば、
          スワップ(I、maxPos)。
          私はmaxPosを=。
        } 
      }
      

ヒープベースの並べ替えを達成するためにどのように?

 

 

おすすめ

転載: www.cnblogs.com/wod-Y/p/12032665.html