【问题标题】:What type of sort is this?这是什么类型的?
【发布时间】:2010-09-30 20:32:35
【问题描述】:

我正在阅读的 C++ 书描述了一种排序算法,说它是 Bubblesort,但我找不到像它一样的单一的bubblesort 变体。我知道差异很小,但它是否与常规冒泡排序一样有效?

BubbleSort(int A[], int length)
for (j=0; j < length-1; j++)
  for (i=j+1; i < length; i++)
    if (A[i] < A[j])
      Swap()

基本上,它不是比较两个相邻的值,而是将第一个 A[0] 与每个条目进行比较,在下一次将 A[1] 与其余条目进行比较,然后是 A[2] 等等。

真的只是普通的冒泡排序,特性和性能完全一样吗?

【问题讨论】:

  • 你拼错了inefficient
  • 我没有看到任何比较,所以我不明白这怎么可能是一种排序。
  • 对不起,现在补充。虽然这部分就像冒泡排序一样,但主要只是它选择用于比较的值的方式不同。

标签: c++ sorting bubble-sort


【解决方案1】:

这是selection sort。在每次通过时,您都会找到第 i 个最小的元素并将其放在位置 i。第一遍之后,就没有必要再看 A[0] 了,以此类推。选择排序是最坏情况 O(n2) 和最佳情况 O(n),就像冒泡排序一样,但它的常数因子比冒泡排序小。 Insertion sort,一个额外的改进,甚至更好,对于非常小的数组(少于十个元素左右),它比大多数 O(n log n) 算法更快,因此严重的库排序原语将切换到它对于小的子问题。

【讨论】:

  • 它类似于选择排序是的,但它的不同之处在于将 A[0] 与它发现的每个较小的元素交换。所以说一个包含 N 个元素的逆序数组,它会执行 N-1 次交换,而常规选择排序只会执行 1 次交换,因为它会在交换之前找到正确的(最低)元素。
  • 对不起,你是对的。它与选择排序完全一样,除了我在代码示例中没有完全输入的 IF 中的块。在书中,它实际上使用了与冒泡排序相同的 IF 体,省略了它首先找到最小值的部分。所以作者采取了选择排序,去掉了其中“高效”的部分,称之为冒泡排序。伟大的。 :)
【解决方案2】:

这种排序类似于选择排序,因为每次通过外部循环都会识别最佳元素并将其从进一步考虑中删除。然而,在传统的选择排序中,最好的元素与要删除的元素交换,而其他元素则被单独留下。在您列出的排序中(在“A Basic Approach to Basic”以及其他地方找到 IIRC),其他一些元素也将被交换。我不认为额外的交换完成任何特别有用的事情,并且排序失去了冒泡排序的唯一优势(适合在纯顺序访问媒体上实现)

【讨论】:

  • 所以基本上这只是冒泡排序和选择排序的错误组合?顺便说一句,我在“C++ 中的面向对象编程”中找到了它。
  • @eZet:实际上这是一种“未改进”的选择排序。基本选择排序(如定义)的作用与上述完全相同。我有一个visual comparison of both 可用。 “改进”版本存储最小值,一旦到达末尾,就将其交换。
  • @Josh K:谢谢,这解释了很多。
【解决方案3】:

在我看来,该算法更像是插入排序,因为它们共享相同的(外)循环不变量——在外循环的j-th 迭代之后,j 最小的元素位于正确的位置。

另一方面,冒泡排序的特点是它总是交换相邻元素(你的 sn-p 不满足这个属性)。

这个算法的时间复杂度是O(n^2),就像冒泡排序和插入排序(最坏情况下是快速排序)。

【讨论】:

  • 你说得对,这根本不是冒泡排序的改进。我认为这实际上是选择排序(请参阅我的编辑)
  • @Zack,你说得对,我把名字弄混了(不变量是选择排序的)。
【解决方案4】:

对我来说,它看起来像 Selection Sort。该算法的工作原理如下(如 wiki 页面所述):

  1. 找出列表中的最小值
  2. 将其与第一个位置的值交换
  3. 对列表的其余部分重复上述步骤(从第二个位置开始,每次都前进)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2021-10-26
    • 2012-11-17
    • 2016-10-06
    相关资源
    最近更新 更多