我在python中实现了插入排序,并想知道如何确定算法的复杂性。这是实现插入排序的低效方法吗?对我来说,这似乎是最易读的算法。
import random as rand
source = [3,1,0,10,20,2,1]
target = []
while len(source)!=0:
if len(target) ==0:
target.append(source[0])
source.pop(0)
element = source.pop(0)
if(element <= target[0]):
target.reverse()
target.append(element)
target.reverse()
elif element > target[len(target)-1]:
target.append(element)
else:
for i in range(0,len(target)-1):
if element >= target[i] and element <= target[i+1]:
target.insert(i+1,element)
break
print target
答案 0 :(得分:2)
而不是:
target.reverse()
target.append(element)
target.reverse()
尝试:
target.insert(0, element)
另外,也许可以使用for循环而不是while循环来避免source.pop()
?:
for value in source:
...
在最后的else块中,if测试的第一部分是多余的:
else:
for i in range(0,len(target)-1):
if element >= target[i] and element <= target[i+1]:
target.insert(i+1,element)
break
由于列表已经排序,因此只要找到大于您要插入的元素的元素,就会找到插入位置。
答案 1 :(得分:1)
我会说它效率很低。你怎么知道?您的方法创建了第二个数组,但在选择排序中不需要一个。您使用了大量操作 - 选择排序需要查找和交换,但您有查找,追加,弹出,插入和反转。所以你知道你可以做得更好。
答案 2 :(得分:1)
def insertionsort( aList ):
for i in range( 1, len( aList ) ):
tmp = aList[i]
k = i
while k > 0 and tmp < aList[k - 1]:
aList[k] = aList[k - 1]
k -= 1
aList[k] = tmp
此代码取自g eekviewpoint.com。显然它是O(n^2)
算法,因为它使用了两个循环。但是,如果输入已经排序,则为O(n)
,因为while-loop
会因tmp < aList[k - 1]
失败而被忽略。
答案 3 :(得分:0)
alist = [4,7,9,1,3,0,5,2,6,8]
sortlist = []
print(alist)
print(sortlist)
sortlist.append(alist[0])
alist.pop(0)
while len(alist) != 0:
swap = False
for pos in range(0, len(sortlist)-1):
if sortlist[pos] > alist[0] and swap != True:
sortlist.insert(pos,alist[0])
swap = True
print(alist)
print(sortlist)
if swap == False:
sortlist.insert(len(sortlist),alist[0])
alist.pop(0)
alist = sortlist
print(alist)