所以给定数组A = [3,2,6],A [1] = 3,A [2] = 2,A [3] = 6,排序后我们有A = [2,3,6] ],给出排列P = [2,1,3]。
返回此数组P的算法(越快越好)是什么?
我想要将未排序的数组A中的每个元素都作为一对,将索引作为该对的第二个元素。我会列出一个列表并填写元组。在按值对列表进行排序后(使用一些稳定的排序),索引会相应地移动以给我正确的数组P.这是正确的方法,还是有更好的方法?
答案 0 :(得分:1)
最简单的方法(在大多数编程语言中)是构造一个索引数组,并使用比较器中的原始数组对它们进行排序。
例如,在Python中:
A = [3, 2, 6]
sorted(range(3), key=lambda i: A[i])
output:
[1, 0, 2]
请注意,此处的索引在您的问题中基于0而不是从1开始,因此输出为[1, 0, 2]
而不是[2, 1, 3]
。目前很少有编程语言有基于1的索引,尽管有一些。
您建议使用索引修改输入,对其进行排序,然后删除原始值也可以正常工作,尽管我个人更喜欢直接对索引进行排序,如第一种方法。
[j for _, j in sorted(zip([3, 2, 6], range(3)))]
答案 1 :(得分:0)
大多数内置排序功能为您提供了一种指定自定义键比较的方法。您可以使用它来添加间接级别。创建一个最初以[1,2,3]开头的数组P,并对其进行排序。让自定义比较器实际上将A[P[x]]
与A[P[y]]
进行比较,而不是将默认P[x]
与P[y]
进行比较。