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
相关产品推荐
相关产品推荐

