我使用以下算法进行插入排序:
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]的索引列表。
任何指针?我有点卡住了。
已编辑:道歉,按降序排序..
答案 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])。这是从低到高排序。