ページ 11

ソートするプログラムが正しく動作しません

Posted: 2011年1月31日(月) 14:06
by アリーシャ
初めまして。
大学の講義で、「50個の整数を読み込んで小さい順にソートするプログラムを作りなさい(バブルソートは用いないこと)」という課題が出て、そのプログラムを作成したのですが、どこか間違えているらしく、ソート前もソート後も整数の並び順が全く変わりません・・・
課題の提出期限が明後日までなので、非常に焦っています。
どうか、私が作成したプログラムの間違っているところを指摘して頂けないでしょうか。
よろしくお願いいたします。

私が作成したプログラムは、以下のようになっています。
#include<stdio.h>
#define SIZE 50

int main(void)
{
int a[SIZE],temp,k,i;

for (k=0; k<SIZE; k++)
scanf("%d",&a[k]);

printf("整列前:");
for (k=0; k<SIZE; k++) {
if (k%5 == 0)
printf("\n");
printf("%12d",a[k]);
}
printf("\n");

for (k=1; k<SIZE; k++) {
temp = a[SIZE];
if (a[k-1] > temp) {
i = k;
do {
a = a[i-1];
i--;
}while (i > 0 && a[i-1] > temp);
a = temp;
}
}

printf("整列後:");
for (k=0; k<SIZE; k++) {
if (k%5 == 0)
printf("\n");
printf("%12d",a[k]);
}
printf("\n");
return 0;
}

なお、50個の整数は講義の方で決められていて、
8181 5316 2570 692 46
52 6880 2108 1953 6584
1148 3740 5930 6970 6611
94 4268 9510 2986 8406
5378 2685 9804 137 9149
5456 7690 559 2382 9080
788 563 4396 3358 1256
4443 3410 8136 6552 5363
4721 7700 9103 652 4671
5715 746 8939 5226 3733
となっています。

Posted: 2011年1月31日(月) 14:14
by アリーシャ
本当にすみません、ソースコードタグを使い忘れていました・・・
ソースコードタグを使うと、

コード:

#include<stdio.h>
#define SIZE 50

int main(void)
{
int a[SIZE],temp,k,i;

for (k=0; k<SIZE; k++)
scanf("%d",&a[k]);

printf("整列前:");
for (k=0; k<SIZE; k++) {
if (k%5 == 0)
printf("\n");
printf("%12d",a[k]);
}
printf("\n");

for (k=1; k<SIZE; k++) {
temp = a[SIZE];
if (a[k-1] > temp) {
i = k;
do {
a[i] = a[i-1];
i--;
}while (i > 0 && a[i-1] > temp);
a[i] = temp;
}
}

printf("整列後:");
for (k=0; k<SIZE; k++) {
if (k%5 == 0)
printf("\n");
printf("%12d",a[k]);
}
printf("\n");
return 0;
}
となります。

Re: ソートするプログラムが正しく動作しません

Posted: 2011年1月31日(月) 15:04
by kimuchi
挿入ソートですね。
>>20行目
temp = a[SIZE];
とありますが、
temp = a[k];
ではありませんか?

Re: ソートするプログラムが正しく動作しません

Posted: 2011年2月01日(火) 01:25
by アリーシャ
kimuchiさん、アドバイスありがとうございます。
仰る通り、作成したのは挿入ソートです。
確かに、a[SIZE];ではなく、a[k];が正しいと思います。
そのためそこの部分を直してみたのですが、やはり結果は同じでした。
自分でも何度かプログラムを見直しているのですが、私の知識では全く間違っている所が分からないです・・・

Re: ソートするプログラムが正しく動作しません

Posted: 2011年2月01日(火) 03:58
by sizuma
コードは読んでませんが、20行目を指摘どおりに書き換えると、僕の環境ではちゃんと動いてますよ。
とりあえず参照 http://codepad.org/dYWrxRt7

Re: ソートするプログラムが正しく動作しません

Posted: 2011年2月01日(火) 09:47
by kimuchi
一応こちらの実行結果です。

画像

環境はMicrosoft Visual C++ 2010 Express
結果はDebug,Release両ビルドで同じでした。

念のためコードも載せておきます。

コード:

#include<stdio.h>
#define SIZE 50
 
int main(void)
{
	int a[SIZE],temp,k,i;
 
	for (k=0; k<SIZE; k++)
		scanf("%d",&a[k]);
 
	printf("整列前:");
	for (k=0; k<SIZE; k++) {
		if (k%5 == 0)
			printf("\n");
		printf("%12d",a[k]);
	}
	printf("\n");
 
	for (k=1; k<SIZE; k++) {
		temp = a[k];
		if (a[k-1] > temp) {
			i = k;
			do {
				a[i] = a[i-1];
				i--;
			}while (i > 0 && a[i-1] > temp);
			a[i] = temp;
		}
	}
 
	printf("整列後:");
	for (k=0; k<SIZE; k++) {
		if (k%5 == 0)
		printf("\n");
		printf("%12d",a[k]);
	}
	printf("\n");
	return 0;
}
追記:
画像

最初にご投稿いただいたコードのDebug実行結果です。

解決しました

Posted: 2011年2月01日(火) 21:23
by アリーシャ
a[SIZE];からa[k];に書き換える件について、自宅でMicrosoft Visual C++ 2008 Express Editionを使った場合はうまく動作しなかったのですが、大学にてLinuxでXemacsを使ったら正しく動作しました。
kimuchiさんのおかげで課題の提出が間に合いそうです。
本当にありがとうございました。