在什么情况下双向冒泡排序比标准冒泡排序更好?

时间:2017-07-18 18:24:36

标签: python algorithm bubble-sort

我已经实现了双向冒泡排序算法。但是我想不出双向冒泡排序比标准冒泡排序更好的情况。有人能给我一些线索吗?

我在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

谢谢!

1 个答案:

答案 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实际上也是一个非常糟糕的算法,因为它会一次一个地移动一个对象。插入排序将首先计算必须移动的内容,然后快速移动列表的该部分,从而节省大量无用的移动。然而,当学习设计,实现和分析算法时,算法可以用于教育目的,因为与更高级的算法相比,算法将表现得非常糟糕。

自己实现(通用)排序功能可能没有用处:已经为所有流行的编程语言实现了良好的算法,这些算法速度快,占用内存少等等。

相关问题