基本的なソートアルゴリズム(4)

ヒープソート

  ヒープソートアルゴリズムは、任意の瞬間に、配列の唯一の定数素子は、入力配列の外部に格納され、場所をソートします。

排気スタック、ヒープを使用する必要があり、ヒープは、完全二分木、ノードに対応する配列に格納された値にツリー内の各ノードとみなすことができるデータ構造です。

バイナリ木の性質上、我々はI / 2ラベルされた親ノード、ノード2iと、ノード2I + 1の右部分木の左部分木を知ることができます。

  2つのバイナリヒープが最大値と最小ヒープヒープに分割されているがあります。最大ヒープ外毛根付加を指す、すべての親ノードがその子ノード以上です。最大ヒープ最大要素はルートノードに格納されています。

逆に最小および最大ヒープヒープ、ヒープルートにおける最小要素の最も小さいです。

  ヒープソートでは、我々は通常、通常、プライオリティキューの構築に使用される最大ヒープ、杭の最小値を使用します。ヒープは、ツリーとして見ることができます。n個の要素を有するスタックは、完全二分木に基づいています

LOG2 nの高さ。

       最大ヒープを構築する過程で、私たちは親ノードがより大きいまたはその子に等しい最大ヒープ特性を維持したい、時間計算量はO(のlog2 N)です。

 

Javaは達成します

    パブリッククラスHeap_Sort {

      公共int型HEAPSIZE。

      パブリック静的無効メイン(文字列[] args){

        INT []未分類=新しいINT [] {3,3,2,1,7,4,5,9}。

        builtMaxHeap(ソートされていません)。

        以下のために(INT I = unsorted.length-1; I> = 1; I - ){

           int型TMP =ソートされていない[i]は、

             ソートされていない[I] =ソートされていない[1]。

             ソートされていない[1] TMPを=。

           HEAPSIZE = HEAPSIZE-1。

           maxHeap(ソートされていない、1)。

        }

      }

      プライベート静的builtMaxHeap(ソートされていない[] int型){//建堆

        HEAPSIZE = unsorted.length。

        int型のlen = unsorted.length。

        { - (I; I> = 0 iは= / 2 lenは整数)のために

          maxHeap(ソートされていない、I);

        }

    }

      プライベート静的maxHeap(ソートされていない[] int型、私はint型){//最大スタックがルートを保持します

        int型リットル= 2は、* I; //マーク左のサブツリー

        int型はr = 2 * I + 1; //右部分木の標準

        =私は最大のint型。

        IF(L <= HEAPSIZE &&ソートされていない[L]>ソートされていない[I]){//親ノードの左の子ノードは、Lの最大屈折率よりも大きい場合に、そうでなければ

          最大= 1。

        }他{  

          最大= I;

        }

        IF(R <= HEAPSIZE &&ソートされていない[R]>ソートされていない[]最大){//右の子ノードが最大値よりも大きい場合、最大= R。

          最大= R。

        }

        もし(最大!= I){//親ノードは最大値、交換、最大値を維持するために、スタックの本質ではない場合

          int型TMP =ソートされていない[最大]。

          ; [I] [最大] =未分類未分類

          ソートされていない[I] TMPを=。

 

          maxHeap(最大、ソートされていない); //再帰呼び出し

         }

      }

  }

時間の複雑さ: O(N-nlog2)

 

おすすめ

転載: www.cnblogs.com/binhuang01/p/11426511.html