我使用排序算法先对数字进行排序,例如正数,然后对负数进行排序(交换就位,您可以使用变量,但不使用任何容器变量。只是假设我们没有更多的内存空间(用于额外的容器)。因此,首先是排序的正数,然后是排序的负数。
我做到了,但是我需要另一个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)
答案 0 :(得分:2)
当数字开始为正数时,您只需要查找枢轴值
def insertion_sort(data):
pivot = -1
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]
if data[e] >= 0 and data[e-1] < 0:
pivot = e
e -= 1
data[-pivot:], data[:-pivot] = data[:pivot], data[pivot:]
print(data)
答案 1 :(得分:2)
您可以如下定义函数is_greater
:
def is_greater(x, y):
if (x < 0 and y < 0) or (x >= 0 and y >= 0):
return x > y
return x < 0
然后,您可以在第一个循环中使用它代替普通的int比较:
def insertion_sort(data):
for i in range(1, len(data)):
e = i
while e > 0 and is_greater(data[e - 1], data[e]):
data[e - 1], data[e] = data[e], data[e - 1]
e -= 1
print(data)
insertion_sort(d)
输出
[2, 4, 5, 9, -7, -4, -3, -1]