【问题标题】:Cannot sort the array , index out of bound error无法对数组进行排序,索引超出范围错误
【发布时间】:2023-01-21 21:16:10
【问题描述】:

我有 2 个函数,一个交换数组中 2 个元素的值,另一个能够找到数组切片中最小数字的索引,现在当我使用 then 两者来查找排序数组时,我无法这样做是因为我无法理解如何使用交换功能

交换函数

func swapData(arr: [Int], firstIndex: Int, secondIndex: Int) -> [Int] {
    var temp = arr
    var a = firstIndex
    var b = secondIndex
    var x = temp[a]
    temp[a] = temp[b]
    temp[b] = x
    return temp
    
}

查找 minIndex 的函数

func indexOfMinimum(arr:[Int], startIndex: Int) -> Int {
    var newArray = arr[startIndex...]
    var minValue = arr[newArray.startIndex]
    var minIndex = 0
    for i in newArray.startIndex + 1 ..< newArray.endIndex {
        if newArray[i] < minValue {
            minValue = newArray[i]
            minIndex = i - startIndex
        }
    }
   return minIndex
    
}

尝试使用以上 2 对数组进行排序的函数

func selectionSort(arr: [Int]) {
    
    var temp = arr
    var minIndex = 0
    for i in temp.startIndex  ..< temp.endIndex  {
        minIndex = indexOfMinimum(arr: Array(temp[i..<temp.count]), startIndex: temp.startIndex)
      
        
        swapData(arr: Array(temp[i..<temp.count]), firstIndex: temp.startIndex
                     , secondIndex: minIndex)
    }
      
    
   
}

var demoList = [18, 6, 1,66, 44,  78, 9, 22, 1,23]
selectionSort(arr: demoList)

我不断得到原始的未排序数组

【问题讨论】:

    标签: swift


    【解决方案1】:

    在不考虑您的排序功能是否有效的情况下,它具有更大的 问题。它既不改变输入数组或者返回一个新的。考虑以下代码:

    func f(a: [Int]) {
        // do stuff with `a`
    }
    
    var l = [1,2,3]
    
    f(a: l)
    // `l` is unchanged
    

    Swift 中的数组是传值类型。为了在函数内改变一个数组,你必须返回一个新数组或将数组参数标记为 inout 并明确地传递一个对它的引用:

    func f(a: inout [Int]) {
        // do stuff with `a`
    }
    
    var l = [1,2,3]
    
    f(a: &l)
    // `l` may be changed
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多