两个排序功能之间的效率

时间:2013-02-28 02:23:23

标签: python sorting python-2.7 memory-efficient

我创建了两个函数,它们将整数从最低值到最高值再回到低位。这种类型的排序是否存在?无论如何,我有两个我创建的排序函数,它们产生相同的输出。我想知道哪两个效率最高?我可以对它们做出任何改进吗?

  1. sortMiddleMax1
    • 创建新的原始反向排序列表
    • 从索引1开始到列表步长2
  2. sortMiddleMax2
    • 就地排序
    • 从最后一个索引开始到0步骤2
  3. 我试图使第二个效率高于第一个。我没有在内存中创建一个新列表,我附加到最后,而不是正确推送整个列表。我在这个假设中是否正确?

    功能

    def sortMiddleMax1(aList=None, verbose=False):
      if aList == None or len(aList) < 2:
        return aList
      else:
        sList = sorted(x, key=None, reverse=True)
        if verbose: print sList
        index = 1
        while index < len(sList):
          tmp = sList[index]
          del sList[index]
          sList.insert(0, tmp)
          index+=2
          if verbose: print sList
        return sList
    
    def sortMiddleMax2(aList=None, verbose=False):
      if aList == None or len(aList) < 2:
        return aList
      else:
        aList.sort()
        if verbose: print aList
        index = len(aList)-1
        while index > 0:
          tmp = aList[index]
          del aList[index]
          aList.append(tmp)
          index-=2
          if verbose: print aList
        return aList
    

    主要

    x = [1,4,6,8,3,5,7,1,5,8,3,9,2,8]
    print '############# sortMiddleMax1 #############'
    x1 = sortMiddleMax1(x, True)
    print '############# sortMiddleMax2 #############'
    x2 = sortMiddleMax2(x, True)
    

    输出

    ############# sortMiddleMax1 #############
    [9, 8, 8, 8, 7, 6, 5, 5, 4, 3, 3, 2, 1, 1]
    [8, 9, 8, 8, 7, 6, 5, 5, 4, 3, 3, 2, 1, 1]
    [8, 8, 9, 8, 7, 6, 5, 5, 4, 3, 3, 2, 1, 1]
    [6, 8, 8, 9, 8, 7, 5, 5, 4, 3, 3, 2, 1, 1]
    [5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 3, 2, 1, 1]
    [3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 2, 1, 1]
    [2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1, 1]
    [1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]
    ############# sortMiddleMax2 #############
    [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 8, 9]
    [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 8, 9]
    [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 9, 8]
    [1, 1, 2, 3, 3, 4, 5, 5, 6, 8, 8, 9, 8, 7]
    [1, 1, 2, 3, 3, 4, 5, 6, 8, 8, 9, 8, 7, 5]
    [1, 1, 2, 3, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4]
    [1, 1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3]
    [1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]
    

3 个答案:

答案 0 :(得分:1)

您可以使用list slice来获取不带for循环的结果:

x = sorted([1,4,6,8,3,5,7,1,5,8,3,9,2,8])
x2 = x[::2] + x[1::2][::-1]

答案 1 :(得分:1)

我怀疑你当前的两个版本表现完全相同。但是,它们都可以通过使用切片来获得列表中的值,而不是通过删除和插入值来改进。

每个del和每个insert都是O(N),而您每个N/2都在执行,因此排序将为O(N^2)。切片也是O(N),但只需要完成两次。排序O(N log N)所需的时间将逐渐占主导地位。

def sortMiddle3(aList):
    s = sorted(aList) # sort the provided list

    # now take the even indexed items, followed by the odd indexes in reverse
    if len(s) % 2 == 0: # is the number of items even?
        return s[::2] + s[-1::-2] # if so, the last item has an odd index
    else:
        return s[::2] + s[-2::-2]

示例输出:

>>> x = [1,4,6,8,3,5,7,1,5,8,3,9,2,8]
>>> sortMiddle3(x)
[1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]

答案 2 :(得分:1)

您可以使用Python的扩展切片。 [::2]表示每隔一个元素。 [::-2]表示从结尾处获取每一个元素并向后工作。这里第一个切片从0开始,用于偶数长度列表,1开始用于奇数长度列表

>>> x = [1, 4, 6, 8, 3, 5, 7, 1, 5, 8, 3, 9, 2, 8]
>>> x = sorted(x)
>>> x[len(x)%2::2] + x[::-2]
[1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]