前提・実現したいこと
表題のとおりです、降順ヒープソートをC++で実装しようとしています。
関数毎のアルゴリズムを考え、コーディングしたのですが、知識が乏しいのと自分のマシンの非力さに未だ完成にありつけておりません。
ご教授いただけると幸いです。
ヒープソートアルゴリズム
C++
1サイズnの配列D[0]~D[n-1]を入力 2size=0; //2分木を表す配列サイズ初期化 3for(i=0;i<n;i=i+1){push_heap(T, D[i]);} 4for(i=n-1;i>=0;i=i-1){D[i]=delete_maximum(T);}
push_heap関数のアルゴリズム
C++
1ヒープを表す配列T[1]~T[n]と追加されるxを入力 2push_heap(T,x) 3{ 4size=size+1; 5T[size]=x; //データを最後に追加 6k=size; 7 8while((T[k]>T[k/2])&&(k>1)) //親の値と比較 9{ 10swap(T[k],T[k/2]); //親の値が小さければ値を交換 11k=k/2; 12} 13 14}
delete_maximum関数のアルゴリズム
C++
1ヒープを表す配列T[1]~T[n]を入力 2delete_maximum(T) 3{ 4T[1]を出力; 5T[1]=T[size]; 6T[size]を殻にする; //葉のデータを親に移動 7size=size-1; 8k=1; 9 10while(2*k<=size) 11{ 12if(2*k==size) 13{ 14if(T[k]<T[2*k]){swap(T[k],T[2*k]); k=2*k;} 15} 16else{アルゴリズム終了;} 17 18} 19else 20{ 21if(T[2*k]>T[2*k+1]){big=2*k;} 22else{big=2*k+1;} 23if(T[k]<T[big]){swap(T[k],T[big]); k=big;} 24else{アルゴリズム終了;} 25} 26} 27 28}
実際は、データ数とデータを入力させた後にソートさせます。
アドレスが出力されてしまったり、ソートされなかったりと、色々試しましたがうまくできませんでした。