ヒープソートは分割され、大きなヒープの根と根ヒープ。
私は基づいていた木構造を用いてデータを整理する:(ヒープ行コンセプトアイデア小さなルートヒープデータをソートします)
①まず、挿入中に使用されるデータのセット、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 。 } 公共: ボイド挿入(INT&X) { 場合(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 [] = { 23、12、11、2、5、16、26、37、59、29}。 INT、N = はsizeof(ARR)/ はsizeof(INT )。 ヒープソート(ARR、N)。 以下のために(int型私= 0 ; iがN <; Iは++ ) { COUT << ARR [I] << " " 。 } COUT << ENDL。 リターン 0 ; }