ソートプログラム

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

ソートプログラム

#1

投稿記事 by saki » 8年前

c言語でシェルソートを作ってるんですkが
結果を見てもソートされません
どこが間違っているのでしょうか?

コード:

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#define N 10
int main()
{
	int a[N],i,j,k,gap,t;

	srand(time(NULL));
	for(i=0;i<N;i++)
		a[i]=rand()%900+100;

	gap=N/2;
	while(gap>0)
	{
		for(k=gap;k<N;k=k++)
		{     
			for(j=i-gap;j>=0;j=j-gap)
			{
				if(a[j]>a[j+gap]) 
				{
	
					t=a[j]; a[j]=a[j+gap]; a[j+gap]=t;
				}
				
				else
					break;
			}
	}
	gap=gap/2;
	}
		for(j=0;j<N;j++){
			printf("%d",a[j]);
		printf("\n");
		}
		scanf("%d",&a);
}

へにっくす

Re: ソートプログラム

#2

投稿記事 by へにっくす » 8年前

コード貼りつける前に、インデントをそろえてください。
最低限の礼儀です。

とまあお小言はおいといてw

forで指定する箇所がどれも間違ってます。
配列外にアクセスしまくってますし。

とりあえず修正してみました。間違いと思われる個所をコメントに記載しています。

コード:

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#define N 10
int main()
{
	int a[N],i,j,k,gap,t;

	srand(time(NULL));
	for(i=0;i<N;i++)
		a[i]=rand()%900+100;
	// ランダムに決定した配列
	for(j=0;j<N;j++){
		printf("%d,",a[j]);
	}
	printf("\n");
	gap=N/2;
	while(gap>0)
	{
		printf("gap=%d", gap);
		//for(k=gap;k<N;k=k++) // 間違い1
		for(k=0;k<=gap;k=k++)
		{
			printf("k=%d\n", k);
			//for(j=i-gap;j>=0;j=j-gap) // 間違い2
			//{
			//	if(a[j]>a[j+gap]) 
			//	{
			//		t=a[j]; a[j]=a[j+gap]; a[j+gap]=t;
			//	}
			//	else
			//		break; // 間違い3(breakしちゃだめでしょ!!)
			//}
			for ( j = N-k-1; j >= gap; j -= gap )
			{
				printf("[%d,%d]=%d,%d\n", j, j-gap, a[j], a[j-gap]); // ソート対象
				if ( a[j] > a[j-gap] )
				{
					t = a[j];
					a[j] = a[j-gap];
					a[j-gap] = t;
				}
			}
		}
		gap=gap/2;
	}
	// ソートした結果
	for(j=0;j<N;j++){
		printf("%d,",a[j]);
	}
	printf("\n");
	getchar();
}

へにっくす

Re: ソートプログラム

#3

投稿記事 by へにっくす » 8年前

おっと、細かいけど。

コード:

		//for(k=gap;k<N;k=k++) // 間違い1
		for(k=0;k<=gap;k=k++)
ただしくはこう。結果は変わらないけどね。

コード:

		//for(k=gap;k<N;k=k++) // 間違い1
		for(k=0;k<=gap;k++)

ISLe
記事: 2648
登録日時: 9年前
連絡を取る:

Re: ソートプログラム

#4

投稿記事 by ISLe » 8年前

へにっくす さんが書きました:ただしくはこう。結果は変わらないけどね。
規格上k=k++;の動作は未定義なので、kの値が定まらないだけでなく何が起きるか分かりません。
結果が変わらないのは偶然です。
これを細かいと言ってしまうと、場合によってはとても重大な欠陥を見逃すことになると思います。

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: ソートプログラム

#5

投稿記事 by へにっくす » 8年前

ISLe さんが書きました:
へにっくす さんが書きました:ただしくはこう。結果は変わらないけどね。
規格上k=k++;の動作は未定義なので、kの値が定まらないだけでなく何が起きるか分かりません。
結果が変わらないのは偶然です。
これを細かいと言ってしまうと、場合によってはとても重大な欠陥を見逃すことになると思います。
うむ
フォローありがとう。
written by へにっくす

閉鎖

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