0

基本上,我想在不使用“排序”的情况下对数字进行排序。我打算做的是创建一个新列表并将每个 Min 数字放入其中,例如:

for item in List:
    if item < (Min):
        Min = item
        nList.append(Min)
        List.remove(Min)

其中List是输入列表,Min=List[0] and nList =[]

如何使用双循环来保持运行?

4

2 回答 2

1

您正在做的事情(除了逻辑错误)仍在排序 - 它被称为堆排序,这需要O(n log n)时间。

如果您不将列表保留为堆,则您找到的最小值将O(n)不是O(log n),并且您的排序将渐近运行,与冒泡排序一样糟糕 - O(n^2)

于 2013-03-22T19:28:00.523 回答
1

您的第一个问题是它只运行一次列表,因为……您编写了一个for显式运行一次列表的循环,而没有其他循环。

如果您希望它重复遍历列表,请在其周围放置另一个循环。

例如,由于您每次通过循环都从原始列表中删除值,因此您可以继续进行,直到您将它们全部删除,方法是添加while List:为外部循环:

while List:
    for item in List:
        if item < (Min):
            Min = item
            nList.append(Min)
            List.remove(Min)

这实际上不会按原样工作,但这是因为原始逻辑中的其他缺陷,而不是while循环中的任何新内容。

第一个明显的问题是:

  1. List当您迭代它时,您正在从中删除元素。这是非法的,从技术上讲,任何事情都可能发生,但实际上会发生的是您的迭代将跳过某些元素。

  2. 您从 开始MinList[0]尽管这通常不是最小值。这意味着至少您的第一遍会以错误的顺序添加元素。

  3. 最终,您将达到一个点,其中item >= Min每个项目都留在List. 那会发生什么?你永远不会移动任何东西,只是永远循环不做任何事情。

于 2013-03-22T19:43:23.780 回答