【问题标题】:Selection sort comparisons and swaps on an already sorted list已排序列表上的选择排序比较和交换
【发布时间】:2017-12-10 18:58:04
【问题描述】:

我的最终论文样本中的一个问题是:如果大小为 n 的输入已经排序,选择排序算法会进行多少次比较和交换?展示你的工作是如何得出这些数字的。假设仅在必要时进行交换。 https://imgur.com/a/bemaL

我对@9​​87654324@ 的逻辑是这样的

1 与 3 4 5 7 进行比较,因此 n-1 次比较和 0 次交换

3 与 4 5 7 进行比较,因此 n-2 次比较和 0 次交换

4 与 5 7 相比,因此 n-3 比较和 0 次交换

5 与 7 进行比较,因此 n-4 次比较和 0 次交换。

所以比较次数为n-1 + n-2 + n-3 + n-4。并且交换次数为零。

我的逻辑正确吗?如果是这样,对于任何 n 个长度的元素,我该如何回答这个问题?

【问题讨论】:

标签: java algorithm sorting insertion-sort


【解决方案1】:

不,你的逻辑是错误的。你不明白它是如何工作的。这是插入排序的两个循环。

  for (int i = 0; i < n; i++) {
            for (int j = i; j > 0 && less(a[j], a[j-1]); j--) {
                exch(a, j, j-1);
            }
            assert isSorted(a, 0, i);

1 不与 3 4 5 比较,但 3 与 1 比较,并且由于它大于内部 for 循环中断,因此 4 与 3 比较,因为 4 > 3 然后再次内部循环中断。

尝试插入值并看到内部循环将中断并且不会发生交换。所以总共你有 O(n-1) 比较哪个是 O(n)。

如果你反转输入数组,那么它将具有最差的时间复杂度,即 O(n^2) 比较和交换。

【讨论】:

  • 我很抱歉。我的意思是标题中的选择排序,而不是插入排序。我修好了它。希望你能回答。
  • 对于 selectionSort 是正确的,总是 O(n^2) 比较
  • 我们还没有做过这个 O 的东西(我相信它叫做 Big O notation?)。您能在不使用它的情况下得出比较次数吗?或者对于给定的 n 是不可能的?
  • 是的,它是大 O 符号。您在答案中写的内容是正确的。首先它比较n-1 数字然后n-2 然后n-3 等等。在这里,它找到最小元素并将其替换为第一个元素,然后将第二个最小值替换为第二个元素等...
  • @hyden55Printf 如果你计算这个系列,那么你会得到这样的结果: n +(n-1)+(n-2)+ .... + 1 和 big-O 只取最高项这是 n(n-1) = n^2 - n 并且使用 Big-O 你再次抛出低阶项 O(n^2 - n) = O(n^2)。这只是一个上限。
猜你喜欢
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
相关资源
最近更新 更多