我已经实现了双向冒泡排序算法。但是我想不出双向冒泡排序比标准冒泡排序更好的情况。有人能给我一些线索吗?
我在Python中的实现:
def bubbleSort_v(my_list):
s = 0
e = 0
right = True
for index in range(len(my_list)-1,0,-1):
if right:
right = False
for idx in range(s,index+e,1):
if my_list[idx] > my_list[idx+1]:
my_list[idx],my_list[idx+1] = my_list[idx+1],my_list[idx]
s += 1
else:
right = True
for idx in range(index-1+s,e,-1):
if my_list[idx] < my_list[idx-1]:
my_list[idx],my_list[idx-1] = my_list[idx-1],my_list[idx]
e += 1
return my_list
谢谢!
答案 0 :(得分:2)
如果列表中的元素位于右侧(例如最后一个索引),则应将其移动到列表的左侧(例如第一个索引)。单方向冒泡排序需要很长时间:每次只移动一步。
如果我们执行双向bubblesort,则元素将在第一步向右移动。
所以一般来说,如果一个或多个元素应该移动(在很多地方),在完成单一方向bubblesort的相反方向,则会更好。强>
对于你的bubblesort的实现,它将没有太大的区别:通常bubblesort将在它排序时进行测试。如果它可以在没有交换的情况下完成全部运行,它将停止工作。
例如,单向的bubblesort移动到 right :
def single_bubble(data):
for i in range(len(data)):
can_exit = True
for j in range(len(data)-i-1):
if data[j] > data[j+1]:
data[j],data[j+1] = data[j+1],data[j]
can_exit = False
if can_exit:
return
因此,如果您想将一个元素移动到 left ,那么对于每个这样的步骤,您将不得不再次执行完整循环。我们可以多一点优化上述方法,但这种行为无法消除。
双向bubblesort可以实现如下:
def single_bubble(data):
for i in range(len(data)):
can_exit = True
for j in range(len(data)-i-1):
if data[j] > data[j+1]:
data[j],data[j+1] = data[j+1],data[j]
can_exit = False
if can_exit:
return
for j in range(len(data)-i,i,-1):
if data[j-i] > data[j]:
data[j-1],data[j] = data[j],data[j-1]
can_exit = False
if can_exit:
return
话虽这么说,冒泡排序不一般来说是一个很好的排序算法。存在更好的算法,如快速排序, mergesort , timsort , radixsort (用于数值数据)等。< / p>
即使在 O(n 2 )算法中,Bubblesort实际上也是一个非常糟糕的算法,因为它会一次一个地移动一个对象。插入排序将首先计算必须移动的内容,然后快速移动列表的该部分,从而节省大量无用的移动。然而,当学习设计,实现和分析算法时,算法可以用于教育目的,因为与更高级的算法相比,算法将表现得非常糟糕。
自己实现(通用)排序功能可能没有用处:已经为所有流行的编程语言实现了良好的算法,这些算法速度快,占用内存少等等。