Swiftで行こう!--バブルソートをwhileで
そのままのコードです。
func bubbleSort(_ inputArr:[Int]) -> [Int] {
guard inputArr.count > 1 else {
return inputArr
}
var res = inputArr
let count = res.count
var isSwapped = false
repeat {
isSwapped = false
for index in stride(from: 1, to: count, by: 1) {
if res[index] < res[index - 1] {
res.swapAt((index - 1), index)
isSwapped = true
}
}
} while isSwapped
return res
}
今回のものは"for in"文でまず一通り並び替える操作をします。そこで、並び替えが必要になくなったら終了ということになっています。
その真偽を"isSwapped"に入れて"repeat while"でループを回します。そして、数字の入れ替えには"swapAt()"を使って行なっています。
少しわかりやすく分解してみます。
var arr = [32,12,12,23,11,19,81,76]
var isSwapped = false
for index in stride(from:1,to:arr.count,by:1){
isSwapped = false
if arr[index] < arr[index - 1]{
print(index)
arr.swapAt((index-1),index)
isSwapped = true
}
print(isSwapped)
}
print(arr)
var isSwapped = false でまず真偽を定義します。
for index in stride(from:1,to:arr.count,by:1){}で一つずつ取り出して、
if arr[index] < arr[index - 1]{}で比較します。真であれば、
arr.swapAt((index-1),index)で入れ替えます。
ここで、 print(index)で配列の中の動きをみてみます。if文のなかに入れることで、真であるときのindex,配列の中の数字を確認してみると
1,2,3,4,5,7とindexは出力されます。6のみ出てきません。6の場合のみが入れ替えなし、index -1がindexより小さいindexの方が大きく入れ替えの必要なしということになっているということです。もう少し詳しく
var arr = [32,12,12,23,11,19,81,76]
の中で比べるのは、まず、32と12を比べると12が小さいので入れ替えます。
[12,32,12,23,11,19,81,76]
[12,12,32,23,11,19,81,76] 順番にずれていき、比較して入れ替えをしていきます。
これを最後までするのがfor in文一回分です。
要するにこれをrepeat while文で真偽判定して回していきます。
print(isSwapped)で確認すると、この場合もindexが6の場合にfalseになっています。
上記コードの出力結果は以下ですindexが6の場合のみ6が出力されず、falseが確認出来ます。
1
true
2
true
3
true
4
true
5
true
false
7
true
[12, 12, 23, 11, 19, 32, 76, 81]
whileを使うことで真偽を確かめ、並び替えが出来ました。