插入排序得到索引?

时间:2011-03-03 18:43:51

标签: python sorting insertion-sort

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

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]的索引列表。

任何指针?我有点卡住了。

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

6 个答案:

答案 0 :(得分:4)

你为什么写短片?使用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

答案 1 :(得分: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)) ]

只需将调用替换为使用排序算法排序。

答案 2 :(得分:0)

当您设置A[i+1]=key时,请indices[j]=i+1。但是,当您设置A[i+1]=A[i]时,您必须增加具有 indices的{​​{1}}元素的值(因为i的元素位于A的位于i。不幸的是,我认为在最坏的情况下,这种算法的天真实现将是O(n ^ 3)。

答案 3 :(得分:0)

似乎你想改变原型以改变原始数据以便跟踪它们应该有效。我发现当我有时难以同时跟踪两个索引时,我会经常在纸上循环以找出我出错的地方。

答案 4 :(得分:0)

我稍微修改了你的版本。它现在对列表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

答案 5 :(得分:0)

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

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

结果将给出数组([0,3,1,2])。这是从低到高排序。