【问题标题】:What is the role of the for loop in this sorting function?这个排序函数中for循环的作用是什么?
【发布时间】:2015-01-07 18:12:44
【问题描述】:

我在尝试学习数据排序的不同方式时正在研究这个函数,并且我理解了它的主要概念,包括 while 循环。我唯一不明白的是 for 循环在函数第一行的作用。 while 循环不是对列表进行迭代和比较吗?我尝试取出 for 循环,并假设程序无法排序。它运行没有错误,但只是返回了相同的列表,没有改变。如果这对我没有意义,我想我一定不能完全理解这种排序。所以我的问题是:for循环在这个排序函数中的作用是什么?它每次都影响什么?

def selSort(L):
    for i in range(len(L) - 1):
        minIndex = i
        minValue = L[i]
        j = i + 1
        while j < len(L):
            if minValue > L[j]:
                minIndex = j
                minValue = L[j]
            j += 1
        temp = L[i]
        L[i] = L[minIndex]
        L[minIndex] = temp
    return L

Q = [2, 8, 5, 9, 1, 15, 3, 7]
selSort(Q)
print Q

输出:

[1, 2, 3, 5, 7, 8, 9, 15]

【问题讨论】:

  • 您不能在线性时间内对数组进行排序。对于数组中的每个点,您在 [1..N]、[2..N]、[3..N]、[N,N] 中搜索最小值,while 循环搜索最小值,for 循环使其排序数组。如果您只需要一个 while 循环,您将需要 O(n)!
  • 这些都没有帮助,我理解它是选择排序,因此函数名称?而且我问的不是大 O。

标签: python sorting loops


【解决方案1】:

[什么是]函数第一行for循环的作用。 while 循环不是在对列表进行迭代和比较吗?

while 循环为列表中的一个特定位置找到正确的元素for 循环重复搜索每个位置(从而对列表)。

所有if 条件所做的就是找到那些尚未放置的最小元素。因此,在for 循环的第一次迭代中,算法将找到最小的元素;在第二次迭代中,第二小;等等。

【讨论】:

  • 啊哈!那么while循环只是简单地交换两个满足if条件的元素,然后for循环会在下一个元素上再做一次?
  • @Jordan:差不多。 while 循环找到应该进入位置 i 的元素,for 循环对每个 i 重复该元素。
【解决方案2】:

选择排序“选择”数据集中的最小元素并将其放在开头,然后在列表的其余部分重复删除最小元素。换一种说法,在选择排序的每一步,我们沿着列表中的每个位置移动,并找出列表中该位置应该是什么数字。

如果我们有7 5 2 3 4 6 9 1 8 列表,那么我们的第一步是将1 交换到第一个位置,将2 交换到第二个位置,依此类推。我们不必担心列表中的最后一个位置,因为如果我们将其他所有内容放在正确的位置,最后一个元素将在正确的位置,因为它是唯一剩下的一个。

使用这段代码,虽然做得不够清楚,但外部 for 循环会遍历列表中的每个位置,减去最后一个位置 (len(L) - 1)。一旦我们遍历循环内的代码一次,我们将把正确的数字放在第一个位置,然后我们再次尝试填充第二个位置,等等。因为我们已经把所有东西都放在了正确的位置在这个点之前的点中,我们可以假设这个点中正确的东西是这个位置和列表末尾之间的最小项目,所以,while 循环有助于寻找它。然后,我们交换这两个项目。

这段代码有点乱,如果我们将内部的while循环改写为for循环可能会更有意义:

def selSort(L):
    for i in range(len(L) - 1):
        minIndex = i
        minValue = L[i]
        for j in range(i + 1, len(L)):
            if minValue > L[j]:
                minIndex = j
                minValue = L[j]
        temp = L[i]
        L[i] = L[minIndex]
        L[minIndex] = temp
    return L

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-04
    • 2019-04-19
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多