【问题标题】:About bubble sort vs merge sort关于冒泡排序与归并排序
【发布时间】:2013-03-08 03:35:48
【问题描述】:

这是我最近在网上找到的一个面试题:

如果你要实现一个以整数数组作为输入并返回最大值的函数,你会使用冒泡排序还是归并排序来实现这个函数?如果数组大小小于 1000 怎么办?如果大于1000怎么办?

这就是我的想法:

首先,用排序来实现上面的功能真的很奇怪。您只需遍历数组一次并找到最大值。 其次,如果必须在两者之间做出选择,那么冒泡排序会更好——您不必执行整个冒泡排序过程,而只需要执行第一遍。在时间和空间上都比归并排序好。

我的回答有错误吗?我错过了什么吗?

【问题讨论】:

  • 我认为您拒绝这个前提是对的:线性通道(和固定空间)是您找到最大值所需的全部。如果面试官强迫你选择,我建议合并排序,因为它有更好的O(n log n) 时间复杂度。
  • 这可能是一个旨在根除菜鸟的问题...?

标签: algorithm sorting


【解决方案1】:

这是一个棘手的问题。如果您只想要最大值(或者实际上是任何 k 的 kth 值,包括找到中位数),那么有一个非常好的 O(n) 算法。排序是浪费时间。这就是他们想听到的。

正如你所说,最大值的算法真的很简单。要解决这样的问题,您应该准备好快速选择算法,并且能够建议堆数据结构,以防您需要能够改变值列表并始终能够快速产生最大值。

【讨论】:

    【解决方案2】:

    我刚刚搜索了算法。冒泡排序在这两种情况下都会获胜,因为最大的好处是只需运行一次。归并排序不能削减任何捷径,只需要计算最大的数。合并取列表的长度,找到中间,然后中间下面的所有数字都比较左边,上面的数字都比较右边;反对创建独特的配对进行比较。这意味着对于数组中剩下的每个数字,需要进行相同数量的比较。除此之外,每个数字都被比较两次,因此数组的最低数字很可能在两次比较中都被淘汰。意味着在许多情况下进行两次比较后,数组中的数字只减少了一个。泡沫将占主导地位

    【讨论】:

    • 这似乎是一个糟糕的问题,因为如果你要实现这个 if 将是一个冒泡排序算法,它有一个循环,只会完成一次迭代。
    • 也许他们过滤掉了像我这样的人,他们不得不说“等我用谷歌搜索你在说什么,先生”
    【解决方案3】:

    首先我同意你所说的一切,但也许它是在询问了解算法的时间复杂度以及输入大小如何是最快的一个重要因素。

    冒泡排序是O(n<sup>2</sup>),归并排序是O(nlogn)。所以,在一个小集合上它不会有那么不同,但在大量数据上,冒泡排序会慢得多。

    【讨论】:

      【解决方案4】:

      除了最大部分,冒泡排序渐进地变慢,但它对于小的n 有很大的优势,因为它不需要合并/创建新数组。在某些实现中,这可能会使其实时更快。

      【讨论】:

        【解决方案5】:

        只需要一次,在最坏的情况下,找到最大值你只需要遍历整个数组,所以气泡会更好..

        【讨论】:

          【解决方案6】:

          归并排序对于计算机来说很容易对元素进行排序,并且比冒泡排序花费更少的时间。合并排序的最佳情况是n*log2n,最坏情况是n*log2n。冒泡排序最好的情况是O(n),最坏的情况是O(n2)

          【讨论】:

            猜你喜欢
            • 2013-10-09
            • 2013-12-02
            • 2012-05-28
            • 1970-01-01
            • 1970-01-01
            • 2015-08-25
            • 2015-09-16
            • 2021-06-22
            • 2013-06-20
            相关资源
            最近更新 更多