• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 ソートについて)

C言語で選択ソートを実行する方法と結果の表示方法

このQ&Aのポイント
  • C言語で選択ソートを実行する方法とその結果を表示する方法について解説します。
  • 選択ソートは配列を昇順に並び替えるアルゴリズムの一つで、要素を比較して最小値を選び、順番に並べ替えていく方法です。
  • 実際のプログラムでは、配列のコピー、要素の比較、要素の交換などが行われます。ソート後の配列や比較回数、交換回数も表示されます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

明日真面目に見ますが、 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に覚える必要がなくて、単にいきなり 入れ替えればそれでよかっただけ! それだけで実際治るとは思います。

MAPILONN
質問者

お礼

あれから色々と試してみた結果実行結果通りに実行できました! いつも丁寧に解説してくださって本当にありがとうございます!

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

どんな結果がほしいんですか?

回答No.3

>swap(d, i, min); ←この位置って、常にmin=iなんだから意味がないのでは? ここは私のミス。 サブのjループでオーバーライドされてますね。

回答No.2

まだ実際にトレースしたわけじゃないのですが、 ソース内をパッと見て、気持ち悪さを感じたところから 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); // 挿⼊ソートの実⾏ 固定値でしか呼ばないなら、このパラメータそのものがいらないね! ってな。 ただし、後で分離する可能性があるって意思表示する為の ソースなんだな!と認識する人が多いとは思います。 (ここは、別に間違いではない!ただ気持ち悪いだけ) 目で(脳みそ)で経路を追いかけて行ったとき、 「?」にぶつかるその時が一番楽しい時間ですよ! プログラムって。 明日、真面目に見てみますよ。まだ解決していなかったら。

MAPILONN
質問者

補足

色々ありがとうございます! 取り敢えず今回教えてもらったことを踏まえて自分でも取り組んでみます!

回答No.1

しばらく回答がついていないようなので、 要件定義をお願いできます? >途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 それと、どうなったら正しい(検収)になるのかと。 多分簡単な事だとは思うのですが、 問題と答えがわからないので、質問者が何を 間違っているのかが判断できないもので。

MAPILONN
質問者

補足

---------------- 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が表示されなくて色々試してるのですがわかりません…

関連するQ&A