2

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

4 回答 4

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

由于列表已经排序,一旦你找到一个比你插入的元素大的元素,你就找到了插入位置。

于 2013-03-05T21:26:02.893 回答
1

我会说这是相当低效的。你怎么知道?您的方法创建了第二个数组,但您在选择排序中不需要一个。你使用了很多操作——选择排序需要查找和交换,但是你有查找、追加、弹出、插入和反转。所以你知道你可能会做得更好。

于 2013-03-05T22:46:48.700 回答
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]失败而被跳过。

于 2013-03-06T00:50:51.170 回答
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)
于 2017-02-08T11:52:22.750 回答