- ベストアンサー
バブルソートを入れたいのですが
こんにちは、Perlを始めたばかりの初心者です。 さっそく質問の方失礼します。 乱数1~100までの数字のうち20個をとりだし配列にいれ、数字を昇順に入れ替えして昇順前と昇順後の数字を表示する問題なのですが。 @a[100]=(1..100); srand(time()); for($i=0 ; $i<20 ; $i++){ $a=int(rand(@a)); print"$a\n"; } と上記の乱数20個を取り出すことができたのですが、 そのあとの昇順させようとしてバブルソートを利用したいのですが、どのように組み込めばいいかわかりません。 どのように組み込めばいいのでしょうか? お答えの方ヨロシクお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
@a=(1..100); srand(time()); for($i=0 ; $i<20 ; $i++){ $before[$i]=$a[rand @a]; } @after = sort { $a <=> $b } @before; print "before:\n"; print join(",",@before) ; print "\nafter:\n"; print join(",",@after) . "\n";
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
@b = sort { $a <=> $b; } @a; で @a に入っている要素を数値として比較し, 昇順に @b に入れます. 文字列として比較したければ @b = sort { $a cmp $b; } @a; 降順だったら, 数値の場合には @b = sort { $b <=> $a; } @a; 文字列の場合には @b = sort { $b cmp $a; } @a; 一般には sort ブロック 配列 の形で, ブロックの部分は評価して数値になる必要があります. ブロックの中では特殊な変数として $a, $b を使います. 結果として得られる配列は, 前の方の要素を $a, 後ろの方の要素を $b としたときにこのブロックの返す値が 0 以下になるようなものとなります. 例えば { $a <=> $b; } というブロックだと, 最終的に得られる配列は ((前の方の要素) <=> (後ろの方の要素)) <= 0, つまり (前の方の要素) <= (後ろの方の要素) を満たすものになるので昇順にソートできる, ということになります.
お礼
参考にさせて頂きました。 解りやすい説明をありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
どうしてもバブルソートでなければならないという特段の理由がない限りは sort を使うのが普通だと思います.
お礼
早速のアドバイスありがとうございます。 こちらの記入ミスがあったようで、すみません。 使用するのはバブルソート以外のものでもOKです。 ソートでのやり方を教えていただければ幸いです。
お礼
お答えいただき有難うございます。 こちらが作ったものと比べるととても 綺麗にまとまっていたので驚かされました。 参考にさせて頂きました。 ありがとうございます。