教えてください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
つい

教えてください

#1

投稿記事 by つい » 6年前

コード:

#include<stdio.h>

int main(void)
{

	int i, j, k;

	double x[20] = { -1,-0.49,0,-3.1,-8,-3,-7.5,0,-0.98,-4,-3.21,-4
	- 0.19,-2.4,-3.1,-3.6,-8.5,-3.7,-1,-5.4 };

	for(i = 0; i<20;i++)
		for (j = 19; j >= i; j--) {
			if (x[j - 1] > x[j]) {
				k = x[j - 1];
				x[j - 1] = x[j];
				x[j] = k;
}
		}

	for (k = 0; k < 20; k++)
		printf("%f\n", x[k]);

	return 0;


}


これは要素をバブルソートで昇順に整列したいプログラムですが、データが失われてしまいます
そうならないためにはどうしたらいいですか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 教えてください

#2

投稿記事 by みけCAT » 6年前

  • 範囲外アクセスをしない : j >= iをj > iにする
  • 浮動小数点数をint型の変数に代入してデータを失わせるのをやめる : kの型をdoubleにして、20行目と21行目のkをiにする
という修正をするといいでしょう。
オフトピック
xの初期値は一見20個のように見えますが、よく見ると8行目の最後「-4」と9行目の最初「- 0.19」は1個の式「-4 - 0.19」すなわち「-4.19」という1要素なのですね。
そして、明示的に初期値が書かれていない最後の要素には0が入っていますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: 教えてください

#3

投稿記事 by box » 6年前

つい さんが書きました:データが失われてしまいます
そうならないためにはどうしたらいいですか?
kがint型なのがおかしい。double型にすべき。
インデントがグッチャングッチャンで見づらい。修正すべき。

(注)-4 -0.19のくだりは、意をくんで直しておいた。

コード:

#include <stdio.h>

int main(void)
{
    double x[] = {
        -1,    -0.49,  0,    -3.1, -8,   -3,   -7.5,  0,   -0.98, -4,
        -3.21, -4,    -0.19, -2.4, -3.1, -3.6, -8.5, -3.7, -1,    -5.4
    }, t;
    int i, j, n = sizeof(x) / sizeof(x[0]);

    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; j++) {
            if (x[i] > x[j]) {
                t = x[i], x[i] = x[j], x[j] = t;
            }
        }
    }
    for (i = 0; i < n; i++) {
        printf("%f\n", x[i]);
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: 教えてください

#4

投稿記事 by かずま » 6年前

box さんが書きました:(注)-4 -0.19のくだりは、意をくんで直しておいた。
「バブルソートで昇順に整列したい」という
意に反して、挿入ソートにすることはないと思うんですが。

かずま

Re: 教えてください

#5

投稿記事 by かずま » 6年前

かずま さんが書きました:「バブルソートで昇順に整列したい」という
意に反して、挿入ソートにすることはないと思うんですが。
すみません。
boxさんのソートは、挿入ソートではなく、選択ソートでした。

挿入ソートは次の通り

コード:

#include <stdio.h>
 
int main(void)
{
    double x[] = {
        -1,    -0.49,  0,    -3.1, -8,   -3,   -7.5,  0,   -0.98, -4,
        -3.21, -4,    -0.19, -2.4, -3.1, -3.6, -8.5, -3.7, -1,    -5.4
    }, t;
    int i, j, n = sizeof(x) / sizeof(x[0]);
 
    for (i = 1; i < n; i++) {
        t = x[i];
        for (j = i; j > 0 && x[j-1] > t; j--)
            x[j] = x[j-1];
        x[j] = t;
    }
    for (i = 0; i < n; i++)
        printf("%f\n", x[i]);
    return 0;
}
間違った指摘をしてしまいましたが、おかげで
質問者をはじめ、掲示板を見てくださる皆様は
バブルソート、選択ソート、挿入ソートの違いを
見ることができてよかったと思います。
なお、挿入ソートは安定ソートです。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 教えてください

#6

投稿記事 by Dixq (管理人) » 6年前

ついさん
過去のトピックを放置して新しいトピックを建てるのはやめてください。
続きであればこちらに続きを、そうでなければ何かしら回答くれた方々に返事を書いてください。

返信

“C言語何でも質問掲示板” へ戻る