並べ替え

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

並べ替え

#1

投稿記事 by 初心者 » 16年前

はじめまして
いきなりですが値を並べ替えて順番に変数に格納するにはどうすればいいでしょうか?

例えば
a[0]=0;a[1]=1;a[2]=2;a[3]=3・・・a[9]=9;
となっているのを
a[0]=3;a[1]=2;a[2]=6;a[3]=1・・・a[9]=0;
のように並べ替えるものです


ご教授お願いします><
環境はVC++とDXライブラリです

kazuoni

Re:並べ替え

#2

投稿記事 by kazuoni » 16年前

>a[0]=3;a[1]=2;a[2]=6;a[3]=1・・・a[9]=0;
どのように並べ替えるのですか?
規則性はないのですか?

box

Re:並べ替え

#3

投稿記事 by box » 16年前

> いきなりですが値を並べ替えて順番に変数に格納するにはどうすればいいでしょうか?

箱から出したばかりの、きれいに並んでいるトランプを
シャッフルするようなことを考えていますか?

初心者

Re:並べ替え

#4

投稿記事 by 初心者 » 16年前

ごめんなさい
そこに触れるのをわすれてました;
ランダムです
音楽プレイヤーのシャッフル機能のような感じにしたいと思っています

box

Re:並べ替え

#5

投稿記事 by box » 16年前

今回の場合、配列の添字の最小値は0、最大値は9ですね。
そこで、

1)0(添字の最小値)~9(添字の最大値)の範囲の整数の乱数を2個発生させます(m, nとします)。
2)m, nを配列の添字として、a[m]とa[n]とを入れ替えます。
3)前2項の操作を適当な回数だけ繰り返します。

以上の処理で、配列の中身がランダムに並ぶでしょう。

初心者

Re:並べ替え

#6

投稿記事 by 初心者 » 16年前

なるほど!!

入れ物を何度も入れ替えるということですね
自分じゃ絶対思いつかなかった;

とても早い解決ありがとうございます

SooA

Re:並べ替え

#7

投稿記事 by SooA » 16年前

並べ替えるデータ量が今の比ではないくらい多くなる場合、
乱数の出によっては入れ替わらない部分が出てしまいます、
入れ替え回数を増やせばその確率は減りますがスマートではありません。
そういったケースのために別のやり方も書いておきます。
// 元のデータ
	char a[10] = { 0,1,2,3,4,5,6,7,8,9 };
	// 置き換え後のデータ
	char b[10] ;

	int i, r, max = 10 ;

	// シード
	srand( time(NULL) ) ;

	// 元データの回数実行
	for( i=0; i<max; i++ )
	{
		// 乱数で元データを選ぶ
		r = rand() % ( max-i ) ;
		b = a[[/url] ;

		// 使った場所に最後尾のデータを入れる
		a[[/url] = a[ (max-1)-i ] ;

		// 結果の表示
		printf( "%d \n", b ) ;
	}

SCI

Re:並べ替え

#8

投稿記事 by SCI » 16年前

特に、乱数を多用する場面では
r = (int)(rand() / (RAND_MAX + 1.0) * (max - i));
のようにするとより良いでしょう。

閉鎖

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