【发布时间】:2018-11-19 16:05:29
【问题描述】:
我使用排序算法对数字进行排序,例如正数,然后是负数(就地交换,您可以使用变量,但不使用任何容器变量。假设我们没有更多的内存空间对于额外的容器)。所以先排序正数,再排序负数。
我做到了,但我需要另一个 for 循环来对负数进行排序并将它们插入到列表的末尾。
我的问题:有没有办法修改第一个循环以达到相同的结果?
(即:仅使用 1 个for 循环)
例如:
x = [9, -3, 2, -7, -4, -1, 5, 4]
输出应该是:
[2, 4, 5, 9, -7, -4, -3, -1]
这是我的解决方案(但我使用了 2 个 for 循环,我只想使用 1 个):
def insertion_sort(data):
for i in range(1, len(data)):
e = i
while e > 0 and data[e - 1] > data[e]:
data[e - 1], data[e] = data[e], data[e - 1]
e -= 1
for i in range(1, len(data)):
e = i
while e > 0 and data[e - 1] < 0:
if data[e] < 0:
if data[e - 1] < data[e]:
data[e - 1], data[e] = data[e], data[e - 1]
data[e - 1], data[e] = data[e], data[e - 1]
e -= 1
print(data)
【问题讨论】:
-
您是否考虑过进行正常的插入排序,然后找到列表从负数变为正数的索引,然后重新切片列表?该算法仍将受到排序的限制。
-
是的,这个想法很好,但是重新切片列表意味着使用额外的列表(我在我的问题中说不要使用任何额外的容器,只需在适当的位置交换元素)
标签: python python-3.x sorting