我试图在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
答案 0 :(得分:4)
您需要将sorted_list.insert(j-1, i)
更改为sorted_list.insert(j, i)
以在位置j
之前插入。
insert(j-1, ..)
将在上一个元素之前插入,并且在j=0
它将环绕并在最后一个元素之前插入的情况下。
答案 1 :(得分:2)
作为Efferalgan& tzaman提到你的核心问题是由于一个错误。要捕获这些类型的错误,在每次循环迭代中打印i
,j
和sorted_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