ソートアルゴリズムについて質問です。

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

ソートアルゴリズムについて質問です。

#1

投稿記事 by amatwu » 14年前

配列の数値を昇順にソートするプログラムを作りたいのですが
バブルソートのアルゴリズムを参考にして自分なりに考えて作ったプログラムを書きました。

下記のプログラムは配列の中身を昇順としてソートさせようとしたプログラムです。

コード:

#include <stdio.h>

// データの要素数
#define ELEMENT 10

// 変数の中身を入れ換える関数
void Swap(int *x, int *y)
{
	int z;

	z  = *x;
	*x = *y;
	*y = z ; 

	return ;
}

int main()
{
	int i;
	int data[ELEMENT] = { 5, 9, 1, 3, 2, 8, 6, 7, 4, 10 };

	// ソート
	for( i = 0; i < ELEMENT; i++ )
	{
		if( data[i] > data[i+1] )
		{
			Swap( &data[i], &data[i+1] );

			// iを一つ前に戻す
			if( i == 0 )		i  = -1;
			else			i -=  2;
		}
	}

	// 出力
	for( i = 0; i < ELEMENT; i++ )
	{
		printf( "%d\n", data[i] );
	}

	return 0;
}
ソート処理の
if( data > data[i+1] )
上記のif文のままだとdata[0]の数値がデタラメな数値になってしまい、実行時にエラーが発生してしまいます。
このif文の不等号を逆にすると降順として正しく動きます。

昇順としてソートさせようとした時、何故data[0]の値がデタラメな数値になってしまうのか教えてください。

申し訳ないですが返信は翌朝になりそうです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: ソートアルゴリズムについて質問です。

#2

投稿記事 by h2so5 » 14年前

i の数値が ELEMENT-1 の時、data[i+1]は配列の範囲外にアクセスしていますよ。

たいちう
記事: 418
登録日時: 14年前

Re: ソートアルゴリズムについて質問です。

#3

投稿記事 by たいちう » 14年前

> このif文の不等号を逆にすると降順として正しく動きます。
そうは見えませんが。forループは2重にすべきでは?

amatwu

Re: ソートアルゴリズムについて質問です。

#4

投稿記事 by amatwu » 14年前

for文の条件式を
for( i = 0; i < ELEMENT - 1; i++ )
に変更すると正しく動くようになりました。

data[0]にばかり目が行ってて、iがELEMENT-1の時は盲点でした。
本当にありがとうございました。

たいちう
記事: 418
登録日時: 14年前

Re: ソートアルゴリズムについて質問です。

#5

投稿記事 by たいちう » 14年前

申し訳ない。iを戻す処理を見落としていました。
正しく実行できることを確認しました。

閉鎖

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