ヒープソート
ヒープソートアルゴリズムは、任意の瞬間に、配列の唯一の定数素子は、入力配列の外部に格納され、場所をソートします。
排気スタック、ヒープを使用する必要があり、ヒープは、完全二分木、ノードに対応する配列に格納された値にツリー内の各ノードとみなすことができるデータ構造です。
バイナリ木の性質上、我々は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)