我的插入python排序总是将第二个数字放在开头

时间:2019-05-26 13:45:11

标签: python list sorting iteration insertion-sort

我的代码几乎可以正常工作,除了一个小错误,无论值如何,它将第二个元素放在开头。 1,6,2,9,3,8,4,7,5,0变成6,0,1,2,3,4,5,7,8,9

我曾尝试过更改FOR循环中的数字,但除此之外,确实无法发现问题所在

def InsertionSort(array):
    for i in range(len(array)):
        for j in range(len(array)):
            if array[i] <= array[j+1]:
                new = array.pop(i)
                array.insert(j+1,new)
                break
            elif array[i] > array[j+1]:
                continue
        print (array)

2 个答案:

答案 0 :(得分:0)

每次修改要遍历的集合时,都会得到与预期不同的行为。当您从集合中删除项目时,尤其如此,因为它会与当前索引混淆。

这里是一个示例,它简单地交换元素的顺序(并沿途打印调试信息,以便您可以准确地看到正在发生的事情):

def insertionSort(my_list):
    # for every element in our array
    for index in range(1, len(my_list)):
        current = my_list[index]
        position = index

        while position > 0 and my_list[position-1] > current:
            print("Swapped {} for {}".format(my_list[position], my_list[position-1]))
            my_list[position] = my_list[position-1]
            print(my_list)
            position -= 1

        my_list[position] = current

    return my_list

my_list = [8,2,1,3,5,4]

print(insertionSort(my_list))

答案 1 :(得分:0)

存在的问题是,您将第二个元素的位置与第一个元素切换,但后来不再进行比较。

这是一个与您最接近的实现,只需稍作更改即可处理所有条目

ar =[1,6,2,9,3,8,4,7,5,0]
def InsertionSort(array):
    for i in range(len(array)):
            val = array[i]
            while( i > 0 and array[i-1] > val):
                array[i] = array[i-1]
                i = i - 1
            array[i] = val
    print (array)

InsertionSort(ar)