ソートアルゴリズム - ヒープソート(C ++)

ヒープソートは分割され、大きなヒープの根根ヒープ。

私は基づいていた木構造を用いてデータを整理する:(ヒープ行コンセプトアイデア小さなルートヒープデータをソートします)

①まず、挿入中に使用されるデータのセット、Insertheap 、上方調整(シフトアップ)をそれぞれ最小値のスタックの一番上に挿入(ヒープ[0])。

②その後、我々は、良好なヒープを作成Removeheap、ヒープ[0]ノードは、戻り値、割り当てられた最後のリーフノードが[0]、実装ヒープに各時間として取り出される下方調整(シフトダウン)を、以下のルートを見つけます最小ノード、小さなヒープで再作成されました。

書式#include <iostreamの> 
の#include <assert.h>
 使用して 名前空間はstdを、
#define DEFAULT_SIZE 10の
 // 堆排
クラスBigHeap 
{ 
パブリック
    BigHeap(int型 SZ = DEFAULT_SIZE)
    { 
        容量 = SZ> DEFAULT_SIZE?SZ:DEFAULT_SIZE。
        ヒープ = 新しい int型[容量]。
        cursize = 0 ; 
    }
    BigHeap()
    { 
        削除[]ヒープ。
        ヒープ = NULL;
        容量 = cursize = 0 
    } 
公共ボイド挿入(INTX)
    { 
        場合(cursize> = 容量)
             のリターン; 
        【cursize]ヒープ =のXと、
        シフトアップ(cursize)。
        cursize ++ ; 
    } 
    INT RemoveHeap()
    { 
        (cursizeアサート!= 0 )。
        INTキー=ヒープ[ 0 ]。
        ヒープ[ 0 ] =ヒープ[cursize - 1 ]。
        cursize - ; 
        シフトダウン(0 )。
        リターンキー。
    } 
公共ボイドシフトアップ(int型POS)
    { 
        int型 I =(POS - 1)/ 2 int型 J = POS;
        int型 TMP = ヒープ[J]。
        一方、(J> 0 
        { 
            場合(TMP < ヒープ[I])
            { 
                ヒープ[J] = ヒープ[I]。
                J = I;
                私は =(J - 1)/ 2 
            } 
            他に
                ブレーク
        } 
        ヒープ[j]は = TMPと、
    } 
    ボイドシフトダウン(int型POS)
    { 
        int型 I = POS。
        int型 J =私は* 2 + 1 ; // 父的左子树节点
        int型 TMP = ヒープ[i]は、
        一方、(J < cursize)
        { 
            場合(J + 1 <cursize &&ヒープ[J]>ヒープ[J + 1 ])
                J ++ ;
            もし(ヒープ[J] < TMP)
            { 
                ヒープ[I] = ヒープ[J]。
                私は = jは、
                J =私は* 2 + 1 ; 
            } 
            他に
                ブレーク
        } 
        ヒープ[I] = TMPと、
    } 
プライベートint型 *のヒープ。
    int型のcursize。
    int型の能力; 
}。

無効ヒープソート(int型 *、int型N)
{ 
    BigHeap小さな(N)
    以下のためにint型 i = 0 ; iがn <; iは++ 
        small.Insert([I])。
    以下のためにint型 i = 0 ; iがn <I ++の
    { 
        [I] = small.RemoveHeap()を。
    } 
}
 int型のmain()
{ 
    int型 ARR [] = { 231211251626375929}。
    INT、N = はsizeof(ARR)/ はsizeofINT )。
    ヒープソート(ARR、N)。
    以下のためにint型私= 0 ; iがN <; Iは++ 
    { 
        COUT << ARR [I] << "  " 
    } 
    COUT << ENDL。
    
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/single-dont/p/11364387.html
おすすめ