- ベストアンサー
C言語で選択ソートを実行する方法と結果の表示方法
- C言語で選択ソートを実行する方法とその結果を表示する方法について解説します。
- 選択ソートは配列を昇順に並び替えるアルゴリズムの一つで、要素を比較して最小値を選び、順番に並べ替えていく方法です。
- 実際のプログラムでは、配列のコピー、要素の比較、要素の交換などが行われます。ソート後の配列や比較回数、交換回数も表示されます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
明日真面目に見ますが、 for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < i; j++) { この2段ループは正しいと思います。 要するに[4,3,2,1]だった場合に 「1」が「4」の位置に行く必要がある時の 最大数は、変数の長さ-1なので。 4<>3 3<>2 2<>1 ここで入れ替えられるが、4回目ではなく3回目だからです。 で、j=i+1なのは 4<>3 「3」の位置は「4」の位置の次、つまりi+1だから ネストループはi+1で正しい。 ってのを、親ループで0~3-1(つまり0,1,2だということで) これはあってますよ。 違和感は、minに覚える必要がなくて、単にいきなり 入れ替えればそれでよかっただけ! それだけで実際治るとは思います。
その他の回答 (4)
- asuncion
- ベストアンサー率33% (2127/6289)
どんな結果がほしいんですか?
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>swap(d, i, min); ←この位置って、常にmin=iなんだから意味がないのでは? ここは私のミス。 サブのjループでオーバーライドされてますね。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
まだ実際にトレースしたわけじゃないのですが、 ソース内をパッと見て、気持ち悪さを感じたところから void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { ←minって常にiなんじゃ? min = j; ←覚えるより、この時点でswapでいいんじゃ? } } swap(d, i, min); ←この位置って、常にmin=iなんだから意味がないのでは? print_array(d, n); } } などが、気持ち悪く感じた部分になりますね。 ある程度プログラムをやってると(と言っても私は水商売で暇なのでやり始めた程度ですが) 「?なんか、違和感があるぞ?」って感じる時があり、 それを、気持ち悪いぞ!って表現してるんですが。 この感覚が体に染みつくと、後は結構 ほとんどの言語で、金になりますよ^^ JAVA系なら月120万以上稼げる仕事も多く、 PHP系でも、80万とかもざらにあります。 ですが、言語が違っても、この「気持ち悪いぞ?」って 雰囲気だけで、結構いけるんですよね^^ もし、仕事として、勉強しているのであれば、 その感覚がいつか身に付いたらおいしいですよ! #define NUM_ARRAY 4 #define NUM_DATA 5 void selection_sort(int d[], int n) { これも、少し気持ち悪い系 selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ 固定値でしか呼ばないなら、このパラメータそのものがいらないね! ってな。 ただし、後で分離する可能性があるって意思表示する為の ソースなんだな!と認識する人が多いとは思います。 (ここは、別に間違いではない!ただ気持ち悪いだけ) 目で(脳みそ)で経路を追いかけて行ったとき、 「?」にぶつかるその時が一番楽しい時間ですよ! プログラムって。 明日、真面目に見てみますよ。まだ解決していなかったら。
補足
色々ありがとうございます! 取り敢えず今回教えてもらったことを踏まえて自分でも取り組んでみます!
- AsarKingChang
- ベストアンサー率46% (3467/7474)
しばらく回答がついていないようなので、 要件定義をお願いできます? >途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 それと、どうなったら正しい(検収)になるのかと。 多分簡単な事だとは思うのですが、 問題と答えがわからないので、質問者が何を 間違っているのかが判断できないもので。
補足
---------------- 97568 compare a[0] = 9, a[1] = 7 swapa[1]=7, a[0]=9 79568 compare a[1] = 9, a[2] = 5 swapa[2]=5, a[1]=9 compare a[0] = 7, a[1] = 5 swapa[1]=5, a[0]=7 57968 compare a[2] = 9, a[3] = 6 swapa[3]=6, a[2]=9 compare a[1] = 7, a[2] = 6 swapa[2]=6, a[1]=7 compare a[0] = 5, a[1] = 6 56798 compare a[3] = 9, a[4] = 8 swapa[4]=8, a[3]=9 compare a[2] = 7, a[3] = 8 56789 56789 比較回数: 8 交換回数: 6 ---------------- 98765 compare a[0] = 9, a[1] = 8 swapa[1]=8, a[0]=9 89765 compare a[1] = 9, a[2] = 7 swapa[2]=7, a[1]=9 compare a[0] = 8, a[1] = 7 swapa[1]=7, a[0]=8 78965 compare a[2] = 9, a[3] = 6 swapa[3]=6, a[2]=9 compare a[1] = 8, a[2] = 6 swapa[2]=6, a[1]=8 compare a[0] = 7, a[1] = 6 swapa[1]=6, a[0]=7 67895 compare a[3] = 9, a[4] = 5 swapa[4]=5, a[3]=9 compare a[2] = 8, a[3] = 5 swapa[3]=5, a[2]=8 compare a[1] = 7, a[2] = 5 swapa[2]=5, a[1]=7 compare a[0] = 6, a[1] = 5 swapa[1]=5, a[0]=6 56789 56789 比較回数: 10 交換回数: 10 ---------------- 56789 compare a[0] = 5, a[1] = 6 56789 compare a[1] = 6, a[2] = 7 56789 compare a[2] = 7, a[3] = 8 56789 compare a[3] = 8, a[4] = 9 56789 56789 比較回数: 4 交換回数: 0 ---------------- 56879 compare a[0] = 5, a[1] = 6 56879 compare a[1] = 6, a[2] = 8 56879 compare a[2] = 8, a[3] = 7 swapa[3]=7, a[2]=8 compare a[1] = 6, a[2] = 7 56789 compare a[3] = 8, a[4] = 9 56789 56789 比較回数: 5 交換回数: 1 上のような実行結果になれば良いのですがcompareが表示されなくて色々試してるのですがわかりません…
お礼
あれから色々と試してみた結果実行結果通りに実行できました! いつも丁寧に解説してくださって本当にありがとうございます!