接之前的文章 iOS程序员也要学点算法吧-简单排序之冒泡排序 , 我们发现冒泡排序的比较效率和交换效率都是O(N²) ,这一半不是我们想要的,这里引入了选择排序,选择排序讲算法的交换效率减少到了O(N),对于部分编程语言来说,往往交换耗时更大,所以在学习过程中未尝不是一个解决的办法。
选择排序的思想还是,利用双层循环,只不过每次循环中,我们用一个MinIndex变量 记录最小值的下标,在每次内存循环结束后,才发生交换,大大的减少了交换次数, 先来个演示吧
在大数据量的时候交换次数显得尤为明显
代码如图
//:MARK - 2 选择排序
func selectSort<T:Comparable>( aArr:[T]) -> [T] {
var arr = aArr
var minIndex = 0 // 记录每次遍历的最小值
for outerIndex in 0..<arr.count {
minIndex = outerIndex
for innerIndex in (outerIndex + 1)..<arr.count {
if arr[minIndex] > arr[innerIndex] {
minIndex = innerIndex // 判断最小值,充值选择的标记
}
// 在每次外层遍历之后再交换
if minIndex != outerIndex {
let t = arr[outerIndex]
arr[outerIndex] = arr[minIndex]
arr[minIndex] = t
}
}
}
return arr
}
print(selectSort([9,8,7,6,5,4,3,2,1,0]))