这是实现冒泡排序的正确方法吗?

时间:2016-09-20 15:00:02

标签: python bubble-sort

这是实施冒泡排序的正确方法吗? 我得到一个排序列表,但我怀疑该方法是否正确。

# Input unsorted list
size_lis = int(input("enter the size of the list"))
size = 0
list1 = list()

while (size < size_lis):
    element = int(input("enter the element"))
    list1.append(element)
    size += 1

# Sort
for i in range(0, len(list1)):
    for j in range(0, len(list1)-1):
        if list1[j] > list1[j+1]:
            list1[j],list1[j+1] = list1[j+1],list1[j]

print(list1)

2 个答案:

答案 0 :(得分:1)

这是冒泡排序算法的正确实现。但是你可以使用这种实现来防止额外的循环:

def bubble_sort(arr):
    for i in range(len(arr))[::-1]:
        for j in range(1, i + 1):
            if arr[j - 1] > arr[j]:
                arr[j], arr[j-1] = arr[j-1], arr[j]

第一个循环以相反的顺序迭代range(len(arr))[::-1] - 以最有效的方式反转列表的操作)。在此循环的第一次迭代之后,列表中的最大元素将放在列表的末尾。而第二个循环只需要通过剩余的元素进行迭代。

我在1000个元素上使用两个相同的数组测试了你的(bubble_sort_2)和我的(bubble_sort)实现。 以下是结果(使用 cProfile ):

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.215    0.215    0.215    0.215   bs.py:22(bubble_sort_2)
    1    0.128    0.128    0.128    0.128   bs.py:16(bubble_sort)

如您所见,bubble_sortbubble_sort_2快。

答案 1 :(得分:1)

在冒泡排序中,最大的元素一步一步地移动到列表的末尾。因此,在第一次通过后,这一个元素处于其最终位置。第二遍应该只对N-1个剩余元素进行排序等。

在发布的代码中,只需像这样调整内圈。这将节省近50%的CPU时间。

n = len(lst)
for i in range(n):
    for j in range(n-i-1):
        if lst[j] > lst[j+1]:
            lst[j], lst[j+1] = lst[j+1],lst[j]