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]
我正在尝试通过递归冒泡排序按升序对列表进行排序。结果列表不是排序列表。如果发现缩进错误,请忽略。
答案 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)
我们将子列表的索引传递给我们的递归函数,并且始终对原始列表执行操作而没有任何分片。上面的代码应按预期输出排序列表。