ページ 11

シェルソートによってデータを昇順にソートするプログラム

Posted: 2016年9月01日(木) 21:52
by 柚林
c言語初心者です。ソートした結果が正しくならなくて困っています。
シェルソートで、ランダムな200個のデータを昇順に並べたいのですが、結果に負の数がたくさん出てきます。
どう直したらよいのでしょうか?
Visual Studioを使っています。
回答お待ちしてます。よろしくお願いします。

コード:

#include<stdio.h>
#include<stdlib.h>
int main(void) {
	int i, j,k,l;
	int a = 200, num = 0;
	int test[1000];
	printf_s("処理する200個のデータは以下の通り。\n\n");
	for (k = 0; k < 200; k++) {
		test[k] = rand();
		printf_s("%d ", test[k]);
	}
	printf_s("\n\n\n");

	while (a != 1) {
		
		if (a % 2 == 1) {
			a = a / 2;
			for (i = 0; i < a + 1; i++) {
				if (test[i] > test[i + a]) {
					num = test[i];
					test[i] = test[i + a];
					test[i + a] = num;
					for (j = i - a; j < a; j -= a) {
						if(test[j+a]<test[j]){
								num = test[j];
								test[j] = test[j+a];
								test[j+a] = num;
							}
							else   break; 
						}
					}
				}
			}
		else if (a % 2 == 0) {
			a = a / 2;
			for (i = 0; i < a; i++) {
				if (test[i] > test[i + a]) {
					num = test[i];
					test[i] = test[i + a];
					test[i + a] = num;
					for (j = i-a; j < a; j-=a) {
						if (test[j+a] > test[j]) {
								num = test[j];
								test[j] = test[j+a];
								test[j+a] = num;
							}
							else break;
						}
					}
				}
			}
		}
	printf_s("昇順にソートしたデータは以下の通り。\n\n");
	for (l = 0; l < 200; l++) {
		printf_s("%d ", test[l]);
	}
	return 0;

}

Re: シェルソートによってデータを昇順にソートするプログラム

Posted: 2016年9月01日(木) 23:03
by みけCAT
柚林 さんが書きました:結果に負の数がたくさん出てきます。
どう直したらよいのでしょうか?
詳しく解析はしていないですが、最低限確保された範囲の外にアクセスしないようにしましょう。
例えば、最初はa=200なのでa % 2 == 1は偽、a % 2 == 0は真です。
i==0のとき、もしtest > test[i + a]が真だとすると、
aは100 (a = a / 2;が実行された結果)、j=i-aは-100なので、j<aは真であり、
その次の文においてtest[j]、すなわちtest[-100]にアクセスし、範囲外なので未定義動作になります。
test[0]~test[199]のみを初期化しているので、この範囲のみにアクセスするようにしましょう。
(初期化されていない自動変数の値は不定であり、その不定の値を使っても未定義動作になります)

Re: シェルソートによってデータを昇順にソートするプログラム

Posted: 2016年9月01日(木) 23:55
by 柚林
みけCATさん、ありがとうございました!
言われたことに気を付けて考え直してみたら、昇順にソートできました。
助かりました!!