不使用排序进行排序
基本上,我想在不使用'sort'的情况下对数字进行排序。我的计划是创建一个新的列表,把每一个最小的数字放进去,比如:
for item in List:
if item < (Min):
Min = item
nList.append(Min)
List.remove(Min)
这里的List是输入的列表,Min=List[0],而nList是一个空列表。
我该如何使用双重循环来让它运行呢?
2 个回答
1
你现在做的事情(除了逻辑错误)其实还是在排序,这种排序方法叫做 堆排序,它的时间复杂度是 O(n log n)
。
如果你不把列表保持为堆的结构,那么找到最小值的时间就会变成 O(n)
,而不是 O(log n)
,这样你的排序效率就会变得很差,跟冒泡排序一样,时间复杂度是 O(n^2)
。
1
你遇到的第一个问题是,你的代码只遍历了一次列表,因为你写了一个for
循环,它只会让你走一遍列表,没有其他的循环。
如果你想让它多次遍历列表,可以在外面再加一个循环。
比如说,因为你每次循环都在从原始列表中删除值,你可以通过在外面加上while List:
来一直进行,直到把所有的值都删除掉:
while List:
for item in List:
if item < (Min):
Min = item
nList.append(Min)
List.remove(Min)
不过,这样做其实不会有效果,原因是你原来的逻辑还有其他问题,而不是while
循环本身的问题。
首先,明显的问题有:
你在遍历
List
的时候同时在删除里面的元素。这是非法的,技术上讲可能会发生各种意外,但实际上会导致你跳过一些元素。你把
Min
初始化为List[0]
,尽管这通常不是最小值。这意味着至少在第一次遍历时,你添加的元素顺序会错。最终,你会遇到这样的情况:
item >= Min
对于List
中剩下的每个元素都是成立的。那时候会发生什么呢?你什么都不动,就会一直循环下去,什么也不做。