假设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排序来完成这项工作吗?
我是算法的新手并发现它有点令人生畏:(感谢您的帮助。
答案 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
所需的比较之外,您不需要进行任何比较,因此复杂性是相同的。
每次移动元素时,只需在两个数组中移动它即可。