Python:按升序排序

Python: sorting by increasing order

我正在尝试编写一个程序,给定一个列表,该程序将按照递增的数学顺序对元素进行排序。例如,如果输入为 [2,4,3,1,5],则输出为 [1,2,3,4,5]。我的代码是:

def trival(liste):
   i=0
   l=len(liste)
   while i+1<=l-1:
       a=liste[i]
       b=liste[i+1]
       if a>b:
           a,b=b,a
       print (liste)
       i=i+1

但是,在我收到的输出中:

[2, 4, 3, 5, 1]
[2, 4, 3, 5, 1]
[2, 4, 3, 5, 1]
[2, 4, 3, 5, 1]

显然这是错误的。有什么建议吗?

以下语句不影响列表。它只是交换 a, b.

的值
a, b = b, a

您需要使用列表项分配来交换列表项:

liste[i], liste[i+1] = liste[i+1], liste[i]

>>> liste = [5, 4, 3]
>>> i = 0
>>> a = liste[i]
>>> b = liste[i+1]
>>> a, b = b, a
>>> a   # a, b value changed
4
>>> b
5
>>> liste  # but not for the list.
[5, 4, 3]

>>> liste[i], liste[i+1] = liste[i+1], liste[i]
>>> liste
[4, 5, 3]

顺便说一句,如果你正在实施冒泡排序,你需要迭代更多(直到没有交换发生)

您只对列表进行一次传递,因此您只对相邻元素进行排序。你还需要做:

liste[i], liste[i+1] = liste[i+1], liste[i]

而不是:

a, b = b, a

如果您真的想更改列表。我想这就是你想要做的:

def trival(liste):
   for j in range(len(liste)-1, 0 ,-1):
        for i in range(j):
            if liste[i]>liste[i+1]:
                liste[i+1],liste[i]=liste[i],liste[i+1]
        print (liste)

>>> trival([2,4,3,1,5])
[2, 3, 1, 4, 5]
[2, 1, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

您需要将项目分配回各自的索引。

交换后,if a>b: ...添加以下代码:

liste[i] = a
liste[i+1] = b

正如代码所示,您提取 i 和 i+1 处的元素,将它们存储在单独的变量中。但是 a 和 b 不 "know" 它们属于列表。它们只是价值观。

你的问题出在这里:

if a>b:
    a, b = b, a

这不会交换元素,只会交换本地名称。您必须重新分配列表中的元素:

liste[i] = a
liste[i+1] = b

或者只使用列表中的值,而不使用 ab。您还可以使用 for 循环而不是 while 循环,使您的代码:

def trival(liste):
    for i in range(len(liste) - 1):
        if liste[i] > liste[i+1]:
            liste[i], liste[i+1] = liste[i+1], liste[i]
        print(liste)

这会产生以下输出:

[2, 4, 3, 1, 5]
[2, 3, 4, 1, 5]
[2, 3, 1, 4, 5]
[2, 3, 1, 4, 5]

如果你正在实施冒泡排序,你将需要迭代直到没有更多的交换,所以你可以使用一个变量来跟踪:

def trival(liste):
    sorted = False
    while not sorted:
        sorted = True
        for i in range(len(liste) - 1):
            if liste[i] > liste[i+1]:
                liste[i], liste[i+1] = liste[i+1], liste[i]
                sorted = False
            print(liste)
    return liste

产生 [1, 2, 3, 4, 5] 的正确结果。请注意,您可能想要复制列表和 return 排序后的副本,而不是就地排序。