【问题标题】:insertion sort get indices?插入排序获取索引?
【发布时间】:2011-03-03 18:43:50
【问题描述】:

我使用以下算法进行插入排序:

def insertionSort(A):
    indices = [z for z in xrange(len(A))]
    for j in range(1, len(A)):
        key = A[j]
        i = j-1
        while (i>=0) and (A[i]<key):
            A[i+1] = A[i]  
            indices[j-i-1] = i+1         
            i = i-1

        A[i+1] = key

但是,我需要维护一个列表来将 A 的原始值的索引映射到 A 的排序值,这意味着如果在排序列表后我有一个 [1,3,4,2] 列表 = [4,3,2,1] 我将有一个 [3,1,0,2] 的索引列表。

有什么建议吗?我有点卡住了。

已编辑:抱歉,按降序排序..

【问题讨论】:

  • 您的代码反向排序,[1,3,4,2][4, 3, 2, 1] ...
  • (1,0), (3,1), (4,2), (2,3) 按 t[0] 排序得到 (1,0), (2,3), (3,1), (4,2),所以索引列表应该是 [0,3,1,2]。
  • 为什么每个人都弄错了?看起来已经够清楚了。它从原始位置映射到排序位置,而不是相反。

标签: python sorting insertion-sort


【解决方案1】:

你为什么要写一个排序?使用 Python 的内置排序。

def sort_with_indexes(data):
    sorted_data = sorted(enumerate(data), key=lambda key: key[1])
    indexes = range(len(data))
    indexes.sort(key=lambda key: sorted_data[key][0])
    return [i[1] for i in sorted_data], indexes

data, indexes = sort_with_indexes([1,3,4,2])
print data, indexes

【讨论】:

  • 拜托,索引。当您说“他为记录编制索引”之类的内容时,您会使用“索引”
  • 它们都是有效的。欢迎使用现代英语。
  • @Glenn 哇,确实。它仍然让我觉得非常奇怪。
  • Python 的排序有据可查,因为它对于几乎排序的列表非常有效。
  • 谢谢,我会试试看,但为什么要使用 sorted() 而不是 sort()?
【解决方案2】:

解决 NullUserException 的问题很简单:

sorted_list, mapping = zip(*sorted([ (v, i) for i, v in enumerate(l) ]))
index_list = [ mapping.index(i) for i in range(len(sorted_list)) ]

只需用您的排序算法替换对 sorted 的调用。

【讨论】:

    【解决方案3】:

    当您设置A[i+1]=key 时,显然是indices[j]=i+1。但是,当您设置 A[i+1]=A[i] 时,您必须增加具有 value iindices 元素的值(因为 A 的元素现在位于 ii+1)。不幸的是,我认为这个算法的幼稚实现在最坏的情况下将是 O(n^3)。

    【讨论】:

      【解决方案4】:

      似乎您在更改原始数组以跟踪它们的同时更改索引数组的想法应该可行。我发现当我有时无法同时跟踪两个索引时,我经常会求助于单步执行纸上的循环来找出哪里出错了。

      【讨论】:

        【解决方案5】:

        我稍微修改了你的版本。它现在对列表 A 进行就地排序(非降序)并返回一个带有“排序索引”的列表。

        def insertionSort(A):
            sorted_indices = [0]
            for j in range(1, len(A)):
                sorted_indices.append(j)
                key = A[j]
                i = j - 1
                while i >= 0 and A[i] > key:
                    A[i+1] = A[i]
                    sorted_indices[i+1] = sorted_indices[i]
                    i -= 1
                A[i+1] = key
                sorted_indices[i+1] = j
            return sorted_indices
        

        【讨论】:

        • 这给出了[0, 3, 1, 2],我们已经确定是错误的。
        【解决方案6】:

        我试图解决同样的问题,但我是对数组而不是列表进行排序。使用 sorted 的问题是它返回一个列表,就我的目的而言,它占用了太多内存。幸运的是,您可以使用数组和 argsort 对 numpy 执行此操作:

        import numpy
        a=numpy.array([1,3,4,2])
        p=a.argsort()
        

        这将给出 array([0,3,1,2]) 作为结果。这是从低到高排序的。

        【讨论】:

          猜你喜欢
          • 2020-12-20
          • 2017-08-09
          • 2016-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-16
          相关资源
          最近更新 更多