バブルソートについて

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

バブルソートについて

#1

投稿記事 by さんb » 7年前

バブルソートのプログラムです。
条件として
・ランダムな数字を100個生成して、昇順にバブルソート
・ソート前、ソート後の数字を見やすいように10個ずつ並べて改行する
・普通のバブルソートは並び替えが終了しているのに"データ数-1"繰り返されますが、"データ数-1"行う前に昇順になっていることもあるのでそれを判定してできるだけ少ない回数でバブルソートをする
というのがあります。
質問は
・できるだけ少ない回数でバブルソートをするという条件にwhileを使ってみたがコンパイルできない
・乱数を生成させているが、実行しても同じ数字が表示される
という点です。
宜しくお願いします。

コード:

#include <stdio.h>
#include <stdlib.h>
#define NUM_DATA 100

void BubSort(int num[], int n);
void datasee(int num[], int n);
int main(void);


/* バブルソートを行う */
void BubSort(int num[], int n)
{
	int i, j, temp;
	while (num[j] > num[j - 1]) {
		for (j = n - 1; j > i; j--) {
			if (num[j] > num[j - 1]) {  /* 前の要素の方が大きかったら */
				temp = num[j];        /* 交換する */
				num[j] = num[j - 1];
				num[j - 1] = temp;
			}
		
		}
		//datasee(num, NUM_DATA);
	}
}



void datasee(int num[], int n)
{
	int i = 1;
	while (n--) {
		printf("%3d  ", *num++);
		i++;
		if (n % 10 == 0) {
			printf("\n");
		}
	}
	printf("\n");
}

int main(void)
{
	int num[100], i;

	for (i = 0; i < NUM_DATA; i++) {
		num[i] = rand();
	}

	printf("(Before)\n");
	datasee(num, NUM_DATA);
	printf("\n");


	BubSort(num, NUM_DATA);
	printf("\n");


	printf("(After)\n");
	datasee(num, NUM_DATA);
	printf("\n");
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: バブルソートについて

#2

投稿記事 by みけCAT » 7年前

さんb さんが書きました:・できるだけ少ない回数でバブルソートをするという条件にwhileを使ってみたがコンパイルできない
Wandboxではコンパイルが通りましたが、BubSort関数内で初期化されていない変数iが使用されているという警告が出ました。
未初期化の自動変数の値(不定)が使用されているので、未定義動作になります。
警告もエラーとして扱う環境では、コンパイルできないかもしれません。
さんb さんが書きました:・乱数を生成させているが、実行しても同じ数字が表示される
time.hをincludeし、main関数の最初でsrand((unsigned int)time(NULL));を呼び出すというのが、毎回違う乱数を出させるための入門書的な方法です。
(time関数の性質上、多くの環境では1秒以内に再実行すると同じ乱数になってしまうことがあります)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

さんb

Re: バブルソートについて

#3

投稿記事 by さんb » 7年前

解答の方ありがとうございます。
あと追加で質問があるのですが
バブルソートの初歩的な質問なのですが
2個目のforのfor( j = n-1; j > i; j-- )のj > iなのですがj はj:n-1~j>iの間でj-- jの変化で動作すると認識しているのですが
j > iの間ということは下記のようにn=5とするとi=2,j=2でj > iを満たさずforの繰り返しが終了しn[1]とi[0]の交換が実行されないのでという疑問です。よろしくお願いします。

i j
0 4
1 3
2 2
3 1
4 0

コード:

void bubbleSort( int dt[], int n )
{
    int i, j, temp;

    for( i = 0; i < n-1; i++ ) {
        for( j = n-1; j > i; j-- ) {
            if( dt[j-1] > dt[j] ) {
                printf( "i:%d) %d と %d を交換", i, dt[j-1], dt[j] );
                temp = dt[j];
                dt[j] = dt[j-1];
                dt[j-1] = temp;
                printf( " --> " ); prtData( dt, n );
            }
        }
    printf( "%d回目 比較交換終了時 ", i+1 ); prtData( dt, n );
    }
}
 

さんb

Re: バブルソートについて

#4

投稿記事 by さんb » 7年前

解決しました。
ありがとうございます。

さんb

Re: バブルソートについて

#5

投稿記事 by さんb » 7年前

c言語を学んでいます。バブルソートでできるだけ少ない回数でソートを終了するために(本来for (i = 0; i<n-1; i++))

コード:

l = 0;
		for (k = n - 1; k = 1; k--) {
			if (dt[k - 1] < dt[k]) {
				l++;
 

という、昇順になっていたらソート終了するプログラムを付け加えました。
54-3,3-2,2-1,1-0とデータの大きさを比べていき昇順となっていればl=4となりfor (i = 0; l=4; i++) {が終了しソート完了という意味で付け加えました。
実行しても

ソート前 5 4 1 6 2
i:0) 6 と 2 を交換 --> 5 4 1 2 6
i:0) 4 と 1 を交換 --> 5 1 4 2 6
i:0) 5 と 1 を交換 --> 1 5 4 2 6

となります。解決方法を教えてください。よろしくお願いします。

コード:

#include <stdio.h>

void prtData(int data[], int n)
{
	int i;

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

void bubbleSort(int dt[], int n)
{
	int i, j, temp, k, l;

	for (i = 0; l=4; i++) {
		for (j = n - 1; j > i; j--) {
			if (dt[j - 1] > dt[j]) {
				printf("i:%d) %d と %d を交換", i, dt[j - 1], dt[j]);
				temp = dt[j];
				dt[j] = dt[j - 1];
				dt[j - 1] = temp;
				printf(" --> "); prtData(dt, n);
			}//if
		}//for2
		
		l = 0;
		for (k = n - 1; k = 1; k--) {
			if (dt[k - 1] < dt[k]) {
				l++;
			}

		}

		printf("%d回目 比較交換終了時 ", i + 1); prtData(dt, n);
	}//for1
}//全体

int main()
{
	int data[] = { 5, 4, 1, 6, 2 };

	printf("ソート前 "); prtData(data, 5);
	bubbleSort(data, 5);
	printf("ソート後 "); prtData(data, 5);
}

かずま

Re: バブルソートについて

#6

投稿記事 by かずま » 7年前

さんb さんが書きました:解決しました。
追加の質問の回答は何ですか?
説明をよろしくお願いします。

それから、解決したコード全体を
貼り付けてもらえませんか?

「できるだけ少ない回数でソート」という
条件は実現されていますか?

返信

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