插入排序Python

时间:2013-03-05 21:08:13

标签: python algorithm sorting insertion-sort

我在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 

4 个答案:

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