我有这段代码可以对列表进行排序,而无需在python中使用sorted函数。输出与预期相反(从最大到最小而不是从最小到最大)
将<更改为>似乎有帮助,但我不确定为什么会这样
lista=[2,1,5,1,3,6]
for i in range(len(lista)):
for l in range(len(lista)):
if i==l:
continue
if lista[l]<lista[i]:
temp=lista[i]
lista[i]=lista[l]
lista[l]=temp
print(lista)
预期的输出列表会变小到最大,但是除非我将<符号更改为>符号,否则得到相反的结果,但是我不确定为什么会这样?
答案 0 :(得分:3)
尝试在纸上写算法的每个迭代:
i = 0: 2 1 5 1 3 6
i = 1: 1 2 5 1 3 6
i = 2: 2 1 5 1 3 6
您的问题是内循环for l in range(len(lista)):
每次都从0开始,但是您必须从位置i开始。当您完成内部循环时,将i递增1,然后对i进行排序之前的所有内容。如果这种情况下内部循环从头开始重新启动,您将获得1小于2(在i = 1上),请再次交换它。
lista=[2,1,5,1,3,6]
for i in range(len(lista)):
for l in range(i, len(lista)):
if i==l:
continue
if lista[l]<lista[i]:
temp=lista[i]
lista[i]=lista[l]
lista[l]=temp
我建议您阅读有关insertion sort和selection sort的知识,以更好地学习该算法。
答案 1 :(得分:0)
问题在于第二个循环再次遍历整个列表。您要做的是改为查看其余元素:
lista = [2, 1, 5, 1, 3, 6]
for i in range(len(lista)):
# change range to start at i
for l in range(i, len(lista)):
if i == l:
continue
if lista[l] < lista[i]:
temp = lista[i]
lista[i] = lista[l]
lista[l] = temp
编辑:更具体地讲,考虑一下外循环的最后一次迭代会发生什么。 lista[i]
将是列表上的最后一个地点,并且每次lista[l]
较小时您都会进行交换,因此最后您的编号最小,为最后一个。