You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift选择排序实现遇问题:数组无法排序及索引越界求助

解决选择排序中的数组未排序与索引越界问题

问题根源拆解

你的代码存在几个关键错误,导致排序无效且出现索引越界:

  • 排序函数未更新原数组:swapData返回修改后的新数组,但你调用后没有将结果赋值给temp,且selectionSort没有返回排序后的数组,原数组完全没被修改。
  • 最小值索引逻辑混乱:使用数组切片后,切片索引与原数组索引混淆,返回的minIndex是切片内的相对偏移,无法直接用于原数组操作。
  • 参数传递错误:调用indexOfMinimum时,传递切片转成的新数组同时传入原数组的startIndex,导致循环中索引范围不匹配,触发越界。
  • 交换操作无效:调用swapData时传递的是切片副本,修改的是副本而非原temp数组,且未接收返回值,等于白执行。

修正后的完整代码

1. 简化交换函数(或直接用内置方法)

func swapData(arr: [Int], firstIndex: Int, secondIndex: Int) -> [Int] {
    var tempArr = arr
    tempArr.swapAt(firstIndex, secondIndex) // 用Swift内置交换方法简化逻辑
    return tempArr
}

2. 修正最小值索引查找函数

直接在原数组范围内遍历,避免切片索引混乱:

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

3. 修正选择排序函数(两种实现方式)

方式1:返回排序后的新数组

func selectionSort(arr: [Int]) -> [Int] {
    var tempArr = arr
    
    for i in tempArr.startIndex ..< tempArr.endIndex {
        // 从当前i位置开始找最小值的全局索引
        let minIndex = indexOfMinimum(arr: tempArr, startIndex: i)
        // 交换并更新数组
        tempArr = swapData(arr: tempArr, firstIndex: i, secondIndex: minIndex)
    }
    
    return tempArr
}

// 调用示例
var demoList = [18, 6, 1, 66, 44, 78, 9, 22, 1, 23]
let sortedList = selectionSort(arr: demoList)
print(sortedList) // 输出: [1, 1, 6, 9, 18, 22, 23, 44, 66, 78]

方式2:用inout直接修改原数组(更高效)

func selectionSort(arr: inout [Int]) {
    for i in arr.startIndex ..< arr.endIndex {
        let minIndex = indexOfMinimum(arr: arr, startIndex: i)
        arr.swapAt(i, minIndex) // 直接修改原数组,无需返回新数组
    }
}

// 调用示例
var demoList = [18, 6, 1, 66, 44, 78, 9, 22, 1, 23]
selectionSort(arr: &demoList)
print(demoList) // 输出排序后的数组

额外优化建议

  • 直接使用Swift内置的swapAt方法替代自定义交换函数,减少冗余代码。
  • 选择排序时间复杂度为O(n²),仅适合小规模数据排序,大规模数据建议使用arr.sorted()等内置高效排序方法。

内容的提问来源于stack exchange,提问作者multiverse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:25:57