在切片上使用递归进行错误的气泡排序;列表未最终排序

时间:2018-11-23 20:29:07

标签: python-3.x algorithm sorting bubble-sort

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

l = [3, 2, 1]
bubble_sort(l)
print(l)

放弃

[2,1,3]

我正在尝试通过递归冒泡排序按升序对列表进行排序。结果列表不是排序列表。如果发现缩进错误,请忽略。

1 个答案:

答案 0 :(得分:3)

您的代码的问题在于,在python中,切片运算符会返回切片的新副本,而不是引用。那就是我们要进行以下操作

lst = [1, 2, 3, 4]
slice = lst[2:]
slice[0] = -5
print(lst)

输出为[1, 2, 3, 4]。原始列表不会更改。这是您的代码中的问题;当您将列表的一部分传递给递归函数时,您不会对原始列表进行排序。解决此问题的一种方法是传递索引而不是切片。可能的解决方案如下:

from random import shuffle


def bubble_sort(lst, n):
    if n == 1:
        return
    for i in range(n - 1):
        if lst[i] > lst[i+1]:
            lst[i], lst[i+1] = lst[i+1], lst[i]
    bubble_sort(lst, n - 1)


n = 50
x = [i for i in range(50)]
shuffle(x)
bubble_sort(x, n)
print(x)

我们将子列表的索引传递给我们的递归函数,并且始终对原始列表执行操作而没有任何分片。上面的代码应按预期输出排序列表。