确定排序的哪种排列对数组进行排序

时间:2016-05-05 02:38:42

标签: algorithm sorting

所以给定数组A = [3,2,6],A [1] = 3,A [2] = 2,A [3] = 6,排序后我们有A = [2,3,6] ],给出排列P = [2,1,3]。

返回此数组P的算法(越快越好)是什么?

我想要将未排序的数组A中的每个元素都作为一对,将索引作为该对的第二个元素。我会列出一个列表并填写元组。在按值对列表进行排序后(使用一些稳定的排序),索引会相应地移动以给我正确的数组P.这是正确的方法,还是有更好的方法?

2 个答案:

答案 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]进行比较。