插入排序不排序

时间:2016-10-05 13:26:49

标签: python algorithm insertion-sort

我试图在python中创建一个插入排序,但是返回的列表没有排序。我的代码有什么问题?

参数:[3,2,1,4,5,8,7,9,6]

结果:2 1 3 6 4 7 五 8 9

Python代码:

def insertion_sort(mylist):
    sorted_list = []
    for i in mylist:
        posfound = 0 #defaults to 0
        for j in range(len(sorted_list)):
            if sorted_list[j] > i:
                sorted_list.insert(j-1, i) #put the number in before element 'j'
                posfound = 1 #if you found the correct position in the list set to 1
                break
        if posfound == 0: #if you can't find a place in the list
            sorted_list.insert(len(sorted_list), i) #put number at the end of the list
    return sorted_list

3 个答案:

答案 0 :(得分:4)

您需要将sorted_list.insert(j-1, i)更改为sorted_list.insert(j, i)以在位置j之前插入。

insert(j-1, ..)将在上一个元素之前插入,并且在j=0它将环绕并在最后一个元素之前插入的情况下。

Python data structures tutorial可能有用。

答案 1 :(得分:2)

作为Efferalgan& tzaman提到你的核心问题是由于一个错误。要捕获这些类型的错误,在每次循环迭代中打印ijsorted_list以确保它们包含您认为包含的内容非常有用。

以下是您算法的几个版本。首先,修复版本的代码修复了一个一个错误;如果没有找到插入位置,它还会实施Efferalgan建议使用.append

def insertion_sort(mylist):
    sorted_list = []
    for i in mylist:
        posfound = 0 #defaults to 0
        for j in range(len(sorted_list)):
            if sorted_list[j] > i:
                sorted_list.insert(j, i) #put the number in before element 'j'
                posfound = 1 #if you found the correct position in the list set to 1
                break
        if posfound == 0: #if you can't find a place in the list
            sorted_list.append(i) #put number at the end of the list
    return sorted_list

这是一个稍微改进的版本,它在循环上使用else子句而不是posfound标志;它还使用切片分配来进行插入。

def insertion_sort(mylist):
    sorted_list = []
    for i in mylist:
        for j in range(len(sorted_list)):
            if sorted_list[j] > i:
                sorted_list[j:j] = [i]
                break
        else: #if you can't find a place in the list
            sorted_list.append(i) #put number at the end of the list
    return sorted_list

最后,使用enumerate获取sorted_list中的索引和项而不是简单的range循环的版本。

def insertion_sort(mylist):
    sorted_list = []
    for u in mylist:
        for j, v in enumerate(sorted_list):
            if v > u:
                sorted_list[j:j] = [u]
                break
        else: #if you can't find a place in the list
            sorted_list.append(u) #put number at the end of the list
    return sorted_list

答案 2 :(得分:1)

通常,这是一个一个错误,下面的代码是固定的。我也做了一些比较漂亮的部分。

def insertion_sort(mylist):
    sorted_list = []
    for i in mylist:
        for index, j in enumerate(sorted_list):
            if j > i:
                sorted_list.insert(index, i) #put the number in before element 'j'
                break
        else:
            sorted_list.append(i) #put number at the end of the list
    return sorted_list