根据我的理解,冒泡排序(低效版本)将按如下方式执行:
2 3 8 6 23 14 16 1 123 90 (10 elements)
[0]
和元素[1]
[0]
大于[1]
,则完成交换。 [1]
大于[0]
,则表示没有完成交换。 然后,冒泡排序将移至比较元素[1]
和[2]
,依此类推,共创建9个互换。
然而,有没有办法可以保证在第一次通过时,最高的数字将在[9]
的适当位置,而在第二次通过时,两个最高的数字将在他们的正确位置位于[7]
和[8]
的地方?
答案 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)
可以采取两项措施来优化冒泡排序。首先,跟踪是单次通过期间发生的任何交换。如果没有发生,那么列表必须已完全按该点排序,因此您不必进行任何额外的通行证。此外,每次通过时减少循环的范围,因为每次通过后一个元素应该处于正确的位置。