見出し画像

Swiftでいこう -- アルゴリズムでいこう。2

Swift Algorithm Clubさんより。

選択ソート Selection Sort

最初に配列の中から順番に最小値(最大値)を探します。見つけた値と配列の先頭[0]の値と交換します。

先頭[0]は最小値ということがわかったので、[0]は置いといて、次、[1]の値を対象に配列内の数字と比べます。見つかった値を配列の[1]と交換します。

[0]から順番に[1][2][3]・・・と比較交換を行います。これの繰り返しです。

func selectionSort(_ array: [Int]) -> [Int] {
guard array.count > 1 else { return array }  
var a = array                    
for x in 0 ..< a.count - 1 {     
  var lowest = x
  for y in x + 1 ..< a.count {   
    if a[y] < a[lowest] {
      lowest = y
    }
  }
  if x != lowest {               
    a.swapAt(x, lowest)
  }
}
return a
}

最初の条件として、

guard array.count > 1 else { return array }

array.countが2以上のもの、配列の数字が2つ以上を対象に並び替えします。

まず、var lowest = x として最小値を設定します。比較対象の数字としては

0 ..< a.count - 1 なのでまず最初は"0"ですね。

ここで最小値は"x = 0"で、"lowest = 0"です。

for y in x + 1 ..< a.count {   
   if a[y] < a[lowest] {
     lowest = y
   }
 }

yが最小値"lowest"と比較して小さい値であれば"lowest"を"y"の値にするということで、配列内の数字と比べ一番小さい番号を選択し最小値"lowest"を決める。

いったんループを抜けます。それで

if x != lowest {               
   a.swapAt(x, lowest)
 }

ですね。

x != lowest

の条件、"x"が"lowest"が同じでなければ、という条件のもと、のもと、

a.swapAt(x, lowest)   

なので "a"の配列の"x"と"lowest"の値を入れ替えします。

"swapAt(a,b)"はSwiftが最初から持っている便利な関数です。aとbを入れ替えます。

基本この繰り返しです。"x = 0"が終われば、次は"x = 1"という感じで比較対象を変えていきます。元の配列の数字を左から順番に比較して行きます。

[0] →[1]→[2]→[3]→[4]

最後まで行ったら

return a

ということで並び替えした配列を元の配列"a"に入れて終わりです。

試してみましょう!

var result = selectionSort([4,1,7,5])
print(result) 

コンソールに [1, 4, 5, 7]と表示されます。


この記事が気に入ったらサポートをしてみませんか?