【问题标题】:Insertion Sort Python插入排序 Python
【发布时间】:2013-03-05 21:08:13
【问题描述】:

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

【问题讨论】:

  • 不是你的问题,但既然你提到了“可读性”:在 python 中,while len(source)!=0 相当于 while source 如果你知道 source 是一个列表或字符串等。还有, if len(target) == 0 可以是if not target
  • 也推荐阅读PEP-8。例如,缩进 4 个空格。
  • 你不妨看看bisect模块
  • 您只打算将while 循环中的第一个if 语句调用一次。所以将它移出循环 - 将它放在循环之前。就像现在一样,给定一个元素列表,您的函数将尝试从中弹出一个元素 - 两次

标签: python algorithm sorting insertion-sort


【解决方案1】:

代替:

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

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

【讨论】:

  • 将 10 插入 [1,4,17],如果没有该测试的第二部分,10 将插入 1 之后。因此需要该测试的第二部分。
  • 好点,@WillNess。这是多余的第一部分。我在评论区之后的笔记是我的主要观点。我更新了答案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    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 &lt; aList[k - 1] 失败。

    【讨论】:

      【解决方案4】:
      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)
      

      【讨论】:

        猜你喜欢
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多