我正在学习算法并尝试使用Swift交换到数组中的整数,我知道使用'swap'函数是有效的,但我尝试学习不同的方法。 所以我尝试了不同的方法,我不明白一件事 - 我有一个200个整数的数组,当我使用这个方法时:
func selectionSort(var array: [Int]) {
print("Selection Sort")
for i in 0..<array.count {
for j in i+1..<array.count {
if array[j] < array[i] {
let temp = array[j] //runs 7282 times
array[j] = array[i] // runs 7282 times
array[i] = temp // runs 7282 times
}
}
}
print(array)
}
它运行7秒,交换代码运行7282(左右)次, 但是当我使用它时:
func selectionSort(var array: [Int]) {
print("Selection Sort")
for i in 0..<array.count {
for j in i+1..<array.count {
if array[j] < array[i] {
array.insert(array[j], atIndex: i)
array.removeAtIndex(j+1)
}
}
}
print(array)
}
它在1.3秒内只运行198次?
我不明白为什么跑步次数有这么多不同?它仅出现在选择排序中。 如果我使用例如冒泡排序,则运行次数没有这种差异。
答案 0 :(得分:3)
经过进一步审查,我认为我发现了问题。第一种类型必须多次移动数字以使其处于正确位置。第二种排序同时移动多个数字,因为插入将在数组中推送其他数字。我用5个整数数组测试了它。
这是第一个排序方法开始之前的调试器:
注意3远离其正确位置,现在在第一个方法排序一次后,数组现在看起来像这样
现在3处于正确位置,但现在距离正确位置4。它必须重复这个并移动4次,直到它到达最终位置。下一个交换看起来像这样
现在14岁应该在17岁之前移动,但它仍远离正确的位置。所以它必须再次移动!
让我们看看第二种排序方法。
这是排序前的样子
并在第一次交换之后看起来像这样
现在你可以看到,在一次交换后,3和4位于正确的位置。 3只被移动了一次,因此,它被移动到4前面,它将4移动到正确的位置。
现在再换一次......
现在你可以看到它在使用第二种方法进行2次交换后已经正确排序,但它采用了第一种方法4次交换。只有当你有一个更大的数组时,差异才会增大。
第二种方法通过每次插入时将数字推回一个索引来移动多个数字......
一个例子:4,17,14,3,20
如果我在前面插入3 ...
3,4,17,14,3,20
现在删除之前的3 ...
3,4,17,14,20
答案 1 :(得分:2)
方法完全不同。
第一个按照您的预期每次array[j] < array[i]
执行简单交换。
第二个,当array[j] < array[i]
为真时,它将array[j]
移动到i
个位置,将阵列的其余部分移动一个位置
话虽这么说,我手上有点时间,所以我决定在Swift 3中编写你的算法(请注意你如何避免使用temp
):
func selectionSort(_ array: [Int]) {
var array = array
for i in 0..<array.count {
for j in i+1..<array.count {
if array[j] < array[i] {
(array[j], array[i]) = (array[i], array[j])
}
}
}
print(array)
}
func selectionSort2(_ array: [Int]) {
var array = array
for i in 0..<array.count {
for j in i+1..<array.count {
if array[j] < array[i] {
array.insert(array[j], at: i)
array.remove(at: j+1)
}
}
}
print(array)
}
干杯!