优化C中的冒泡排序,这将减少按升序排序数字列表所需的交换次数

时间:2011-11-29 06:13:17

标签: c bubble-sort

根据我的理解,冒泡排序(低效版本)将按如下方式执行:

2 3 8 6 23 14 16 1 123 90  (10 elements)
  1. 比较元素[0]和元素[1]
  2. 如果[0]大于[1],则完成交换。
  3. 如果[1]大于[0],则表示没有完成交换。
  4. 然后,冒泡排序将移至比较元素[1][2],依此类推,共创建9个互换。

    然而,有没有办法可以保证在第一次通过时,最高的数字将在[9]的适当位置,而在第二次通过时,两个最高的数字将在他们的正确位置位于[7][8]的地方?

4 个答案:

答案 0 :(得分:3)

不要使用冒泡排序。考虑优秀的算法,例如

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

如果您已正确实施冒泡排序算法,则最高数字必须始终位于第一遍结束时的正确位置。

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

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

答案 3 :(得分:0)

可以采取两项措施来优化冒泡排序。首先,跟踪是单次通过期间发生的任何交换。如果没有发生,那么列表必须已完全按该点排序,因此您不必进行任何额外的通行证。此外,每次通过时减少循环的范围,因为每次通过后一个元素应该处于正确的位置。