【问题标题】:Does a comparison sort have to compare all adjacent cells?比较排序是否必须比较所有相邻的单元格?
【发布时间】:2010-09-20 01:07:35
【问题描述】:

比较排序是否必须比较 A[i] 最大值和 A[i+1] 最大值?我认为任何比较排序都必须,但我不确定。我检查了归并排序、插入排序和快速排序,并且必须比较它们中的 A[i] 最大值和 A[i+1] 最大值。

【问题讨论】:

  • 查看各种算法可能会给您一些关于如何证明一般规则的线索,但是,“所有算法都是这样的”,并不是从“某些算法是这样的”得出的。这是一个叫做“肯定结果”的谬误。你必须推理它。
  • 你的意思是第 i 个和第 (i+1) 个最大值

标签: arrays algorithm sorting


【解决方案1】:

每个正确的算法都必须比较相邻的单元格,除非它们相等。证明:否则假设。最终数组中的 A[i] 和 A[i+1] 尚未进行比较(A[i]

(*) 这是因为 A[i] 和 A[j] 是相邻的。

【讨论】:

    【解决方案2】:

    是的,在任何比较排序中,相邻的单元格总是会相互比较。有关比较排序下限的更精确定义,请参阅this page

    【讨论】:

      【解决方案3】:

      是的,除非至少有 3 个相同的元素。如果不这样做,就无法保证您已正确排序。避免比较所有对的唯一方法是传递原则。

      A[i] > A[j] and A[j] > A[k] implies A[i] > A[k].
      

      对于不同的连续值,没有中间值可以帮助您避免比较。

      【讨论】:

        【解决方案4】:

        Shell 排序不比较相邻单元格。这就是它们与慢速排序(冒泡、插入、选择)相比获得一些效率的方式。

        【讨论】:

          【解决方案5】:

          快速排序和合并排序将始终比较相邻元素。只有当两个元素不进行比较时,算法才知道两者之间有一个元素。我认为大多数其他 O(nlog n) 排序算法也是如此。

          【讨论】:

            【解决方案6】:

            我怀疑不是。考虑一组完全由一个值的副本组成的值。这些被划分为 2 组 A 和 B,使得 A 组中的任何值都不会大于 B 组中的任何值。然后在它们自己内部进行排序。 A的结束值和B的开始值不需要比较。

            我不知道有没有这方面的实际例子,但想想还是很有趣的。

            【讨论】:

              【解决方案7】:

              对于这类问题(很像更一般的比较排序是 n-log-n 方法),一个(迷你)“对手”论点将是有效的 - 尝试打破任何算法,在某些输入, 不做这样的比较。

              这个想法与更一般的“比较排序需要 O(n log n) 比较”证明非常相似,所以我想你要么最近看到过,要么即将在课堂上介绍它。

              【讨论】:

                【解决方案8】:

                因为我的英语,对不起..我的英语不太流利。

                @see 动画排序算法:http://vision.bc.edu/~dmartin/teaching/sorting/anim-html/all.html

                此站点显示了 8 种排序算法的比较:插入·选择·冒泡·壳·合并·堆·快速·Quick3

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-10-28
                  • 1970-01-01
                  • 2017-11-19
                  • 2015-12-04
                  • 2012-05-04
                  • 1970-01-01
                  相关资源
                  最近更新 更多