【问题标题】:Same print statement provides different output for sorting algorithm (Insertion Sort)相同的打印语句为排序算法(插入排序)提供不同的输出
【发布时间】:2020-05-19 23:29:16
【问题描述】:

我已经编写了插入排序算法并确保它可以工作;但是,根据我打印排序列表的方式,输出会有所不同。例如,

x = some_unsorted_list
x = insertionSort(x)
print(x)

将打印排序列表就好了。另一方面,

x = some_unsorted_list
insertionSort(x)
print(x)

将打印一些部分排序未排序的列表。这是我的选择排序代码:

def insertionSort(L):
    endList = len(L) - 1 

    for i in range(1,endList+1,1): 
        insertVal = L[i]  
        j = i - 1 

        while j >= 0 and L[j] > insertVal:
            L[j+1] = L[j]    
            j -= 1          
        L[j+1] = insertVal  
    #print(L)
    return L

请注意,注释掉的打印语句总是提供排序列表,这引起了我的困惑。

编辑(我遗漏了重要信息):以下是我如何调用插入排序。设 v1、v2 和 v3 为未排序列表。

for i in [v1,v2,v3]:
    x = list(i)
    insertionSort(x)
    print(x) 

回想一下,这就是出现错误的地方。但是,以下代码不会产生错误:

print(insertionSort(v1))
print(insertionSort(v2))
print(insertionSort(v3))

【问题讨论】:

  • Python 是一种有点不寻常的语言,因为值绑定到变量,而不是值分配到变量(复制输入和输出,如它是)。无论这里的问题是什么,它都可能在调用者中,而不是在排序函数中。提供minimal reproducible example 可以帮助其他人帮助您。
  • 也许我以不同的方式执行您的测试,但我总是根据我的尝试对两个列表进行排序。也许正如 torek 建议的那样,如果您提供 minimal reproducible example 会有所帮助。
  • 同样在我的不同尝试中,x 和 L 的id 始终相同,永远不会改变。所以,这与我的尝试中总是对 x 进行排序是一致的。

标签: python list sorting output


【解决方案1】:

当您将变量传递给函数时,会生成一个新副本。因此,当您将x 传递给您的函数时,将创建一个新变量L,其值与x 相同。

现在,我们有 2 个不同的变量,分别名为 xL

在您的函数中,您正在对L 进行更改,而在函数之外,您正在打印x。因此,您会得到错误的结果。因为L 被排序 x

代码之间的区别

在您的第一个代码 sn-p x = insertionSort(x) 中,用函数返回的值覆盖 x 的值(这将始终是一个排序列表)。所以,它打印出正确的结果。 在您的第二个代码 sn-p 中,您 覆盖了 x 的值。因此,您会得到错误的结果。

【讨论】:

  • 该函数确实修改了列表对象,假设它接收到一个实际的列表对象。如果调用者的x 与被调用者的L 绑定到同一个列表,则在调用者中打印x 将打印排序列表。但是,如果函数接收到其他对象,事情可能会变得更加棘手。
  • 谢谢你的回答肯定有助于澄清一些事情!我更新了这个问题,以进一步澄清我是如何真正调用插入排序的——也许这会改变答案。
  • @PM25 答案保持不变。您必须将insertionSort(x) 的结果分配给x,如下所示:x = insertionSort(x)。请记住,此值将一次又一次地被覆盖。因此,v1v2 的结果将丢失。更好的方法是在循环外创建一个数组 results = [] 并在其中附加排序列表:results.append(x) 在循环内 x = insertionSort(x) 之后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多