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

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

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

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

Q&A

解決済

3回答

1354閲覧

C++のバブルソートのロジックが動かない

mofu_mofu

総合スコア73

C

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

0グッド

0クリップ

投稿2019/06/03 01:21

バブルソートを0から実装しているのですが、バブルソートが適用されていません。

どこがおかしいのでしょうか?

gcc (Ubuntu 8.3.0-6ubuntu1) 8.3.0 gcc -o BubbleSort BubbleSort.cpp -lstdc++
#include <iostream> #include <vector> using namespace std; void BubbleSort(vector<int>& v) { size_t s = v.size(); for (int i = 0; i < s; ++i) { for (int j = 0; j >= (i + 1); ++j ) { if (v[j] < v[j -1]) { int tmp = v[j]; v[j] = v[i]; v[i] = tmp; } } } return; } int main() { vector<int> v = {2,1,3}; for (int i = 0; i <= 2; ++i) { cout << v[i] << endl; } BubbleSort(v); size_t s = v.size(); for (int i = 0; i < s; ++i) { cout << v[i] << endl; } return 0; }
2 1 3 2 1 3

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

C

1for (int i = 0; i < s; ++i) { 2 for (int j = 0; j >= (i + 1); ++j ) {

この部分、i に実際の数値を当てはめてどうなるか書いてみてください。
内側のループは j >= (i + 1) が満たされている間、回ります。

追記

C

1if (v[j] < v[j -1]) {

j は 0 になるのでここもかなりまずいですね。

投稿2019/06/03 01:33

編集2019/06/03 01:47
Zuishin

総合スコア28660

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

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

0

うーん、単にソートしたいだけならC++にもソート系関数があった気が...

ProgrammingPlace Plusとか?

課題とかで実装しなければいけないなら、

C++で様々なソートアルゴリズムを実装する...とかどうでしょうか?

これらを見る限り、バブルソートは

  1. 要素数分、行う
  2. 後ろから前に突撃(笑)
  3. 比較...

となっています。

質問者さんのコードを見ると、

C++

1void BubbleSort(vector<int>& v) { 2 size_t s = v.size(); 3 for (int i = 0; i < s; ++i) { 4 for (int j = 0; j >= (i + 1); ++j ) { 5 if (v[j] < v[j -1]) { 6 int tmp = v[j]; 7 v[j] = v[i]; 8 v[i] = tmp; 9 } 10 } 11 } 12 return; 13}

最初のforはいいとしても、二番目のforが...

初期値: 0, 条件: j(このforの独自の変数)が i+1(外側のforの変数に+1)より大きい間, jをインクリメント

となっています。

これが原因じゃないなかなぁと。

これを if( int j = s - 1; j > i; j-- )と単純に書いてみては?

ただし、上記サイトにあるように、「自分なりに」やってください。

そして、今回は有名なアルゴリズムなので探しやすいですが、こういう場合は「実際に数字や文字列を入れて考えてみる」のがコツかなぁと。

たとえば、もしv.sizeが 1 だったら?
v.size が 10 だったら?
v.size が 100だったら?
v.size が 3 だったら?
...

と実際に値を入れて検証してみる。

例えば、0~10までの数字で行うとするなら、i = 0 のとき、i = 1 のとき、i = 2 のとき...と「手作業で」検証してみる。

電卓を使ってもいいですし、Excelでもいいです。
とにかく、数字とかを適当に入れて検証してみる。

すると、ロジックがおかしい場合、「どこかがずれている」状態になります。

i = 1 なら最終的な値は x = 100 になるはずが、 x = 80 となっていたりとか。
この場合、差は20ですが、どこかで -20 をしているか、追加する数字が足りない...とかのような感じでロジックがおかしいっていう風に。

後は、デバッガを使うとか。

投稿2019/06/03 01:50

BeatStar

総合スコア4958

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

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

0

素直に書くならこうだと思います

for (int i = 1; i < s; ++i) { for (int j = 0; j < s; ++j ) { if (v[i] < v[i+1]) { ... } } }

投稿2019/06/03 01:39

編集2019/06/03 07:43
izmktr

総合スコア2856

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

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

Zuishin

2019/06/03 01:42

バブルソートってそんなんでしたっけ?
izmktr

2019/06/03 02:53

バブルソートって学習用ソートですよ?
Zuishin

2019/06/03 02:55

アルゴリズムの名前ですよ?
Zuishin

2019/06/03 02:56

もしかして、学習用は全部バブルソートという認識でしたか?
izmktr

2019/06/03 03:04 編集

ここでフレームになるようなことをしたくないんですけど… 最適化することはバブルソートの要件ではありません 比較を途中で打ち切ったり、始点や終点の最適化をしてシェーカーソートと同等の効率まで引き上げてもバブルソートであるように、 最高に最適化されていないものも同等にバブルソートでしょう そうやって、最終的に挿入ソートへ至る道までがバブルソートだと考えます
Zuishin

2019/06/03 03:10

バブルソートはデータがバブルのように浮いてくることからその名が付けられています。
Zuishin

2019/06/03 03:11

いや、挿入ソートとも違いますね。何だろう。
Zuishin

2019/06/03 03:15

失礼。選択ソートだと思います。
izmktr

2019/06/03 03:21

if文の中がおかしいって話ですか、 (そこならそう指摘してほしい) 他の人もいるし、この記事消しておきます
Zuishin

2019/06/03 03:23

記事は消さず残しておいてください。私もよく間違えますが、間違えたら間違えたと書いて訂正していますし、それがここのルールでもあったと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問