交换整数算法

时间:2016-06-08 12:51:52

标签: arrays swift algorithm

我正在学习算法并尝试使用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次?

我不明白为什么跑步次数有这么多不同?它仅出现在选择排序中。 如果我使用例如冒泡排序,则运行次数没有这种差异。

2 个答案:

答案 0 :(得分:3)

经过进一步审查,我认为我发现了问题。第一种类型必须多次移动数字以使其处于正确位置。第二种排序同时移动多个数字,因为插入将在数组中推送其他数字。我用5个整数数组测试了它。

这是第一个排序方法开始之前的调试器:

enter image description here

注意3远离其正确位置,现在在第一个方法排序一次后,数组现在看起来像这样

enter image description here

现在3处于正确位置,但现在距离正确位置4。它必须重复这个并移动4次,直到它到达最终位置。下一个交换看起来像这样

enter image description here

现在14岁应该在17岁之前移动,但它仍远离正确的位置。所以它必须再次移动!

让我们看看第二种排序方法。

这是排序前的样子

enter image description here

并在第一次交换之后看起来像这样

enter image description here

现在你可以看到,在一次交换后,3和4位于正确的位置。 3只被移动了一次,因此,它被移动到4前面,它将4移动到正确的位置。

现在再换一次......

enter image description here

现在你可以看到它在使用第二种方法进行2次交换后已经正确排序,但它采用了第一种方法4次交换。只有当你有一个更大的数组时,差异才会增大。

第二种方法通过每次插入时将数字推回一个索引来移动多个数字......

一个例子:4,17,14,3,20

  • 4目前处于索引0
  • 17目前处于索引1
  • 14目前处于索引2

如果我在前面插入3 ...

3,4,17,14,3,20

现在删除之前的3 ...

3,4,17,14,20

  • 4现在是索引1!
  • 17现在是索引2!
  • 14现在是索引3!

答案 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)
}

干杯!