首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入排序Python

插入排序Python
EN

Stack Overflow用户
提问于 2013-03-06 05:08:13
回答 4查看 3.3K关注 0票数 2

我在python中实现了插入排序,我想知道如何确定算法的复杂性。这是一种低效的实现插入排序的方式吗?对我来说,这似乎是最具可读性的算法。

代码语言:javascript
复制
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 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-06 05:26:03

而不是:

代码语言:javascript
复制
target.reverse()
target.append(element)
target.reverse()

尝试:

代码语言:javascript
复制
target.insert(0, element)

此外,可以使用for循环,而不是while循环,以避免source.pop()?:

代码语言:javascript
复制
for value in source:
  ...

在最后的else块中,if测试的第一部分是多余的:

代码语言:javascript
复制
else:
   for i in range(0,len(target)-1):
     if element >= target[i] and element <= target[i+1]:
        target.insert(i+1,element)
        break

因为列表已经排序,所以只要找到一个比要插入的元素大的元素,就已经找到了插入位置。

票数 2
EN

Stack Overflow用户

发布于 2013-03-06 06:46:49

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-06 08:50:51

代码语言:javascript
复制
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

这段代码取自geekviewpoint.com。显然,这是一个O(n^2)算法,因为它使用了两个循环。但是,如果输入已经排序,那么它就是O(n),因为while-loop会因为tmp < aList[k - 1]失败而被跳过。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15234129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档