ヒープ
コンセプト
- ヒープは完全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を=。 } }
ヒープベースの並べ替えを達成するためにどのように?