根据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
声明不正确,这种改进总会有所帮助吗?或者我在这里做错了什么?
答案 0 :(得分:0)
上面给出的示例表明,该算法并不是对标准冒泡排序的严格改进。
这种方法的优点(有时称为"鸡尾酒排序,顺便说一句,#34;顺便说一下)如果阵列末端有很多小元素,它会迅速将它们拉到前面与正常的冒泡排序相比。例如,考虑这个数组:
2 3 4 5 6 7 8 9 10 11 12 ... 10,000,000 1
使用正常的冒泡排序,在此数组上需要9,999,999次传递才能对其进行排序,因为元素1(不合适的位置)在每次迭代时只会向前交换一步。另一方面,使用鸡尾酒排序,这只需要两次通过 - 一次初始通过,然后是反向通过。
虽然上面的例子肯定是设计的,但是在一个随机改组的数组中,可能会在数组的末尾有一些较小的元素,并且bubblesort的传递次数必须很大才能移动它们背部。朝两个方向前进都有助于提高速度。
也就是说,bubblesort是排序算法的一个相当糟糕的选择,所以希望这只是一个理论上的讨论。 : - )