python插入排序在列表末尾带有负数

时间:2018-11-19 16:05:30

标签: python python-3.x sorting

我使用排序算法先对数字进行排序,例如正数,然后对负数进行排序(交换就位,您可以使用变量,但不使用任何容器变量。只是假设我们没有更多的内存空间(用于额外的容器)。因此,首先是排序的正数,然后是排序的负数。

我做到了,但是我需要另一个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)

2 个答案:

答案 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]