对于泡沫排序,“相反方向的连续传递”如何改进?

时间:2013-11-15 09:59:22

标签: sorting bubble-sort

根据Tenenbaum使用C 的数据结构,冒泡排序的一个改进是让连续的传递方向相反,以便小元素快速移动到前面,这将减少所需的通过次数[第336页]。 我制定了两个例子,一个支持这个陈述,另一个支持这个陈述。

Supports: 25 48 37 12 57 86 33 92
iterations using usual Bubble sort :
    25 48 37 12 57 86 33 92
    25 37 12 48 57 33 86 92
    25 12 37 48 33 57 86 92
    12 25 37 33 48 57 86 92
    12 25 33 37 48 57 86 92

iterations using improvement:
    25 48 37 12 57 86 33 92
    25 37 12 48 57 33 86 92
    12 25 37 33 48 57 86 92
    12 25 33 37 48 57 86 92

against: 3 4 1 2 5
iterations using usual Bubble sort:
    3 4 1 2 5
    3 1 2 4 5
    1 2 3 4 5

iterations using improvement:
    3 4 1 2 5
    3 1 2 4 5
    1 3 2 4 5
    1 2 3 4 5

声明不正确,这种改进总会有所帮助吗?或者我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

上面给出的示例表明,该算法并不是对标准冒泡排序的严格改进。

这种方法的优点(有时称为"鸡尾酒排序,顺便说一句,#34;顺便说一下)如果阵列末端有很多小元素,它会迅速将它们拉到前面与正常的冒泡排序相比。例如,考虑这个数组:

2 3 4 5 6 7 8 9 10 11 12 ... 10,000,000 1

使用正常的冒泡排序,在此数组上需要9,999,999次传递才能对其进行排序,因为元素1(不合适的位置)在每次迭代时只会向前交换一步。另一方面,使用鸡尾酒排序,这只需要两次通过 - 一次初始通过,然后是反向通过。

虽然上面的例子肯定是设计的,但是在一个随机改组的数组中,可能会在数组的末尾有一些较小的元素,并且bubblesort的传递次数必须很大才能移动它们背部。朝两个方向前进都有助于提高速度。

也就是说,bubblesort是排序算法的一个相当糟糕的选择,所以希望这只是一个理论上的讨论。 : - )