为什么这种排序方法在Python中不起作用?

时间:2019-06-09 15:53:48

标签: python python-3.x list sorting

我有这段代码可以对列表进行排序,而无需在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)

预期的输出列表会变小到最大,但是除非我将<符号更改为>符号,否则得到相反的结果,但是我不确定为什么会这样?

2 个答案:

答案 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 sortselection 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]较小时您都会进行交换,因此最后您的编号最小,为最后一个。