前提
C++で選択ソートを勉強している時にどう動いているかわからなくなりました。
このコードだと一番小さい値を検索できていないと思ったのですが
コードを読む限りi番目とj(i+1番目の左右だけを検索しているように見えます。
実際にN=4
値を43、32、23、1の順番に入れました。自分の予想だと左右の比較をずらしながらやっていると考えたため、32、23、1、43と予想したのですが、1、23、32、43の順番で帰ってきました。
私がわからないのは「未ソート部分から最小値の位置を探し」の部分が私が上げたプログラムとどこに対応しているのか、とfor文の中にfor文とswap関数が入っていてどういう順番で動くのかがわかっていません。
私のどこのコードを読み間違えているかご指摘お願いします。
実現したいこと
-選択ソートのコードがどう動いているか理解したい
発生している問題・エラーメッセージ
#include <iostream> using namespace std; int N, A[200009]; int main() { // 入力 cin >> N; for (int i = 1; i <= N; i++) cin >> A[i]; // 選択ソート for (int i = 1; i <= N - 1; i++) { int Min = i, Min_Value = A[i]; for (int j = i + 1; j <= N; j++) { if (A[j] < Min_Value) { Min = j; // Min は最小値のインデックス(1~N) Min_Value = A[j]; // Min_Value は現時点での最小値 } } swap(A[i], A[Min]); } // 出力 for (int i = 1; i <= N; i++) cout << A[i] << endl; return 0; }
どのソートプログラムも最終的には1、23、32、43と返ってくるかと思いますが、
「32、23、1、43と予想した」というのは初回ループでの結果の話でしょうか?
「左右の比較をずらしながらやっている」バブルソートと勘違いしていないでしょうか?
選択ソートでぐぐれば、図解でわかりやすく解説しているサイトがいくつも見つかります。
そちらを確認されたほうが手っ取り早く理解も早いと思います。
選択ソートは未ソート部分から最小値の位置を探し、その位置の要素と未ソート部分の先頭の要素を交換する。交換されて先頭にきたものはソート済みとすると考えています。私がわからないのは「未ソート部分から最小値の位置を探し」の部分が私が上げたプログラムとどこに対応しているのか、とfor文の中にfor文とswap関数が入っていてどういう順番で動くのかがわかっていません。
43、32、23、1がどういう推移で「32、23、1、43」となる想定なのか簡単に説明してもらえますか?
43と32を比較 入れ替え [32,43,23,1]
43と23を比較 入れ替え [32,23,43,1]
43と1を比較 入れ替え [32,23,1,43]
ということでしょうか?

回答1件
あなたの回答
tips
プレビュー