【问题标题】:Optimizing a bubble sort in C that will decrease the number of swaps needed to sort a list of numbers in ascending order优化 C 中的冒泡排序,这将减少按升序对数字列表进行排序所需的交换次数
【发布时间】:2012-01-08 13:13:09
【问题描述】:

据我了解,冒泡排序(低效版本)的作用如下:

2 3 8 6 23 14 16 1 123 90  (10 elements)
  1. 比较元素[0]和元素[1]
  2. 如果[0] 大于[1],则交换完成。
  3. 如果[1] 大于[0],则没有完成交换。

然后冒泡排序将移动到比较元素 [1][2] 等等,总共创建 9 次交换。

但是,有没有办法保证在第一次通过时,最高的数字将在正确的位置 [9],而在第二次通过时,两个最高的数字将在正确的位置[7][8]?

【问题讨论】:

  • 我不明白这个问题。还有其他的排序算法(quicksort),有理论结果排序至少有O(n log n)复杂度。
  • 我一直在研究快速排序,但我认为我不太了解它的实际作用。您介意对它与冒泡排序的不同之处进行基本解释吗?
  • 不,有很好的书籍(在图书馆)解释了这一点。不要害羞看书;他们的解释比论坛好得多。
  • @user994559 你到底在问什么?
  • 冒泡排序对数组执行多次遍历。关于各种排序算法(快速排序、冒泡排序、插入排序等)的维基百科文章往往相当不错;它们包括工作中算法的动画。 (您所描述的只是一次通过;冒泡排序必须执行多次。我第一次阅读您的问题时,我的印象是您认为一次通过就是整个算法。)

标签: c bubble-sort


【解决方案1】:

不要使用冒泡排序。考虑高级算法,例如

遇到一个问题我如何优化冒泡排序我的答案是优化它,只要它还不是 Timsort。

【讨论】:

  • 嗯,这似乎是一个有效的答案;)
  • 我很喜欢这个答案,所以 +1 :)
【解决方案2】:

冒泡排序是一种特定的算法——询问它是否可以优化以获得您想要的属性是没有意义的。它还具有 O(n^2) 复杂度,这就是它很少使用的原因。

还有其他排序算法,例如选择排序,它的属性更接近您想要的。 Selection sort 将保证在第 i 次通过时,最少 i 个元素位于正确的位置。但是,选择排序也是 O(n^2),如果您预计对大量数据进行排序,则应避免选择排序。

与 Basile 和 Jan 一样,我建议学习一种更高效、更标准的排序算法,即快速排序。快速排序应用非常广泛,在 C 标准库中可用。 Wikipedia对算法的描述比较简洁;在 Google 上搜索也会提供许多动画版本的快速排序,这对学习算法很有帮助。

【讨论】:

    【解决方案3】:

    如果您正确地实现了冒泡排序算法,那么最大的数字必须在第一遍结束时始终位于正确的位置。

    优化只是在第二遍结束时少走一步:

    let n equal top_element - 1
    while n is greater than or equal to zero
      for i = 0 to n
        if element i is greater than element i+1 then swap
      subtract 1 from n
    

    【讨论】:

      【解决方案4】:

      可以做两件事来优化冒泡排序。首先,跟踪单次通过期间是否发生任何交换。如果没有发生,那么该列表必须已经完全排序,因此您不必进行任何额外的传递。此外,每次通过时减小循环的范围,因为每次通过后应该有一个元素位于正确的位置。

      【讨论】:

        猜你喜欢
        • 2017-01-09
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        相关资源
        最近更新 更多