ページ 1 / 1
教えてください
Posted: 2017年7月09日(日) 18:21
by つい
コード:
#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;
}
これは要素をバブルソートで昇順に整列したいプログラムですが、データが失われてしまいます
そうならないためにはどうしたらいいですか?
Re: 教えてください
Posted: 2017年7月09日(日) 18:52
by みけCAT
- 範囲外アクセスをしない : 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が入っていますね。
Re: 教えてください
Posted: 2017年7月09日(日) 18:53
by box
つい さんが書きました:データが失われてしまいます
そうならないためにはどうしたらいいですか?
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: 教えてください
Posted: 2017年7月09日(日) 19:02
by かずま
box さんが書きました:(注)-4 -0.19のくだりは、意をくんで直しておいた。
「バブルソートで昇順に整列したい」という
意に反して、挿入ソートにすることはないと思うんですが。
Re: 教えてください
Posted: 2017年7月10日(月) 08:12
by かずま
かずま さんが書きました:「バブルソートで昇順に整列したい」という
意に反して、挿入ソートにすることはないと思うんですが。
すみません。
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;
}
間違った指摘をしてしまいましたが、おかげで
質問者をはじめ、掲示板を見てくださる皆様は
バブルソート、選択ソート、挿入ソートの違いを
見ることができてよかったと思います。
なお、挿入ソートは安定ソートです。
Re: 教えてください
Posted: 2017年7月10日(月) 20:53
by Dixq (管理人)
ついさん
過去のトピックを放置して新しいトピックを建てるのはやめてください。
続きであればこちらに続きを、そうでなければ何かしら回答くれた方々に返事を書いてください。