質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

2177閲覧

降順ヒープソートをC++で実装しようとしています

ShunSaito

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/12/09 15:22

前提・実現したいこと

表題のとおりです、降順ヒープソートを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}

実際は、データ数とデータを入力させた後にソートさせます。
アドレスが出力されてしまったり、ソートされなかったりと、色々試しましたがうまくできませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/12/09 17:18

やりたいことだけを書かれては, 問題の質問にはなりません. どのようなコードを書き, どのような入力でどのようになるはずがどのようになったのかをお書きください.
2KOH

2019/12/09 18:06

> 知識が乏しいのと自分のマシンの非力さに未だ完成にありつけておりません。 知識が乏しいということを自覚しているのであれば、こんなところで質問する前にアルゴリズムや C++ の入門書で十分な知識を得る方がいいと思います。 また、マシンが非力なのであれば、こんなところで質問する前にお金を貯めて新しいマシンを買えばいいと思います。 (そもそも、マシンが非力なために降順ヒープソートが実装できないという状況が理解不能ではありますが。)
Zuishin

2019/12/09 22:09

ヒープソートであれば push_heap の仕様がおかしいですね。データを末尾に追加しなくても既に追加されているはずです。 それよりまずインデントをつけるところから始めてください。 それが終わったら今度はテストの作成です。 ヒープソートは与えられたデータからヒープを構築し、構築したヒープからデータを順に取り出すことによってソートします。 まずはヒープがきちんと構築できているかどうかを判定するテストを書いてください。 それができたら要素 10 ほどのランダムデータを作り、それを一つ一つヒープに入れていってヒープが崩れないかどうかを判定するテストを書いてください。 その次に構築されたヒープからノードを一つ一つ外していってヒープが崩れないかどうかを判定するテストを書いてください。 最後に、ソートが終わった後のデータが正しくソートされているかを確かめるテストを書いてください。 テストを書き終えたら、テストを通過するよう実装してください。 やらなければならないことは多いですが、あなたはその全てを聞いています。質問サイトではもっと小さな問題を扱うよう想定されているので、インデントもおぼつかない初心者に手取り足取り実装できるまでを教えるのは近くにいる人に頼むのが良いでしょう。 まず最初のテストを作成し、それでうまくいかないようであれば、どううまくいかないかを具体的に聞いてください。
guest

回答1

0

コードを書く場合には、デバッグ環境を整えましょう。
C++であるなら、VisualStudioを入れれば、コードの任意の行で実行を止め、変数のナカミを確認できます
また、そこから1行づつ実行させて変数の状態を確認できるようになります

そうすればご自分でプログラムのバグを確認、修正できるようになりますよ

投稿2019/12/09 23:10

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問