LoginSignup
2
2

More than 5 years have passed since last update.

なっとく!アルゴリズム(p32)をSwiftで書く(配列の要素を小さいものから順に並べていくサンプルコード)

Last updated at Posted at 2019-03-10

配列の要素を小さいものから順に並べていくサンプルコード

import Foundation

//配列を入れると、一番小さいindexを返す
func findSmallest(array: [Int]) -> Int{
    var smallest = array[0]
    var smallestIndex = 0
    //iは0~ 配列の数
    let totalArray = array.count - 1

    for i in smallestIndex ... totalArray {
        if array[i] < smallest {
            smallest = array[i]
            smallestIndex = i
        }

    }
    return smallestIndex
}

//新しい配列をつくる
func selectionSort(array:[Int]) -> [Int] {
    var inputArray = array
    var newArray = [Int]()
    var totalArray = inputArray.count - 1

    for i in 0 ... totalArray {
        //pytonでいう array.pop(smallest)がない? 指定した位置の要素を削除し、値を取得みたいなやつ
        //配列の中の一番小さい値のはいっているindexを習得したら、新しい配列に入れて配列から消す
        let smallest = findSmallest(array:inputArray)
        newArray.append(array[smallest])
        inputArray.remove(at:smallest)
    }
    return newArray
}

var array = [6,4,1]
print(selectionSort(array:array))

実行結果

[1, 4, 6]

Paizaも
https://paiza.io/projects/6jP7hjM4PqqVMQVRPAQMKg?locale=en-us

躓いたところ

func selectionSort(array:[Int]) -> [Int] {
    var newArray = [Int]()
    var totalArray = array.count - 1

    for i in 0 ... totalArray {
        //pytonでいう array.pop(smallest)がない? 指定した位置の要素を削除し、値を取得みたいなやつ
        //配列の中の一番小さい値のはいっているindexを習得したら、新しい配列に入れて配列から消す
        let smallest = findSmallest(array:array)
        newArray.append(array[smallest])
        array.remove(at:smallest)
    }
    return newArray
}

エラー内容

入れている配列は変数のはずなのになぜこういうエラーが出るのか不思議だった

main.swift:30:9: error: cannot use mutating member on immutable value: 'array' is a 'let' constant
        array.remove(at:smallest)

参考文献のリンクを参照し、もしかして値渡しをしなくてはいけないのかなと思い書き直した。
また、関数引数は定数(let)はこういう問題に直面しないと、知らないなとも思った

Swiftは関数引数は定数(let)。関数引数を直接書き換えることはできない。

参考文献

Swiftの値型と参照型、値渡しと参照渡し

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2