如何根据另一个数组对数组进行排序?

时间:2012-04-24 01:26:28

标签: algorithm

假设A = {1,2,3,4},p = {36,3,97,19},使用p作为排序键排序A.你可以得到{2,4,1,3}。

这是本书介绍算法的一个例子。它说它可以在nlogn中完成。

有谁能告诉我如何做到这一点?我的想法是你需要跟踪p中的每个元素以找到它最终的位置,就像p [1]在p [3]处结束然后A [1]在A [3]处结束。任何人都可以使用合并排序或其他nlogn排序来完成这项工作吗?

我是算法的新手并发现它有点令人生畏:(感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

构造索引数组:

i = { 0, 1, 2, 3 }

现在,在排序p时,对索引数组i进行相同的更改。

当你完成后,你将拥有:

i = { 1, 3, 0, 2 }

对两个数组进行排序所需的时间最多为排序一次(实际上,如果您只计算比较,则无需进行任何其他比较,只需将数据交换为两个数组而不是一个数组),以便不会改变整体排序的Big-O复杂性,因为O( 2n log n ) = O(n log n)

现在,您可以通过简单地遍历已排序的索引数组并在该索引处查找A的元素,使用这些索引以线性时间构造已排序的A数组。这需要O( n )时间。

整体算法的运行时复杂性最差:O( n + 2n log n ) = O( n log n )

当然,您也可以完全跳过索引数组,只需以相同的方式处理数组A,然后将其排在p侧。

答案 1 :(得分:1)

我不认为这很困难,因为排序算法的复杂度通常是根据您需要更新数组A中元素位置所需的比较次数来衡量的。 B中的元素。除了已经排序B所需的比较之外,您不需要进行任何比较,因此复杂性是相同的。

每次移动元素时,只需在两个数组中移动它即可。