手違いで挿入ソートを一部間違えて記述してしまいました。
そこで得られた結果を検証することにしたのですが、自分がたどった時の結果と違っていました。何故でしょうか ご教授願います。
swift
1//insert sort 2//insert sort 3var a = [10,3,1,4,2] 4//開始位置を一つずつ後ろへずらす 5for i in 1...a.count-1 { 6 var temp = a[i] 7 //a[i]の入る位置を後ろから調べていく。ここでtoを本来の−1ではなく一個手前の0にしました。 8 for j in stride(from:i-1, to:0, by:-1){ 9 if (temp < a[j]){ 10 a[j+1] = a[j] 11 } else { 12 a[j+1] = temp 13 } 14 } 15 //もしa[i]が先頭に位置していた場合、a[i]を先頭につけます。 16 if (a[0] >= temp){ 17 a[0] = temp 18 } 19} 20print("挿入ソート=",a) 21
出力結果:挿入ソート= [1, 3, 3, 4, 4]
私は以下のようになると頭の中で考えました。forループでiを1からじゅんに増やして言った時、
i=1 3,3,1,4,2
i=2 1,3,3,4,2
i=3 1,3,3,4,2 ←問題はここらしいです。3<4だからelseに行ってa[3]=4となって何も変わらないと思ったのですが違うようです。
i=4 1,3,3,3,4
しかし、プログラムをいじった結果、i=3の段階で異なっていました。
i=3 1,3,4,4,2
が正しい値でした。(iの末尾をa.count-2に変更しました。)
なぜそうなるのかがわかりません。
初歩的な質問ですが、よろしくお願いします。
配列の中身全然変わってますが、本当にそうなりますか?
すみません。a じゃなくて i でしたね。もう一度読んでみます。
ん? やっぱり出力結果は a ですね。もう一度書き直しお願いします。
説明がわかりにくくてすみません。実際にプログラムを動かした結果、i=3で止めた場合1,3,4,4,2で、i=4では1, 3, 3, 4, 4でした。
説明がわかりにくくてすみません。実際にプログラムを動かした結果、i=3で止めた場合1,3,4,4,2で、i=4では1, 3, 3, 4, 4でした。
「10」はどこに行ったんでしょうか?
//もしa[i]が先頭に位置していた場合、a[i]を先頭につけます。の後に書いてある処理で消えました
質問のコードを実行した時に、あなたは「i=3 1,3,3,4,2」になると思ったのに実際には「i=3 1,3,4,4,2」となるのはなぜか?という質問でいいですか?
そうです。
回答2件
あなたの回答
tips
プレビュー