【问题标题】:Is this a Correct Insertion Sort?这是正确的插入排序吗?
【发布时间】:2016-05-17 06:52:12
【问题描述】:

这是我在 Python 中进行插入排序的尝试:

def insert(alis):
    for i in range(1,len(alis)):
        currel = alis[i]
        j = i
        while j > 0 and alis[j]<alis[j-1]:
            alis[j] = alis[j-1]
            alis[j-1]= currel
            j=j-1
    print (alis)

alis = [3,2,6,2,1,678,23,98]
insert(alis)

这似乎有效,但让我感到困惑的是,说

alis = [4,3,2,1]

在i = 1、alis = [3,4,2,1] 之后。那么当alis[2] 设置为4 时,会不会将currel 的值从2 更改为4?所以你会得到[3,4,4,1]?但这似乎并没有使排序出错。

【问题讨论】:

    标签: python algorithm sorting insertion


    【解决方案1】:

    alis 列表包含对其他对象的引用; alis[2] 引用 int 对象 4。设置 currel = alis[2] 会创建对同一对象的另一个引用。

    但是,将alis[2] 更改为引用另一个对象不会影响currel。您没有更改对象4,而是更改了列表对象引用的内容。因此,currel 不会改变。 currel 继续引用对象4,不变。

    您可能想阅读 Ned Batchelder 在他的 Python Conference 2015 演示文稿中给出的(出色的)解释:Python Names and Values。您还可以使用 pythontutor.com 来可视化变量发生的情况;见your code on that site。

    【讨论】:

    • 但是既然currel是通过'i'链接到alis的,那么alis的改动不会影响currel吗?
    • 它没有链接到alis。它链接到alis[i] 也链接到的值。
    • 对不起,我还是不明白。但是,从不同的角度来看,我是否正确地说 currel 保持它在 while 循环之前设置的值,因为您没有在 while 循环之后返回并更新 currel?根据这个原理,currel 的值保持不变,直到我们移动到 i 的下一个值,所以整个系统工作。
    • 是的,您的排序工作正常;您只是对作业做出了错误的假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多