用于就地计算排序排列的算法?

时间:2016-08-21 01:17:28

标签: sorting

如果排序算法仅需要比排序数据多O(1)个内存,则排序算法就位。

给定n个整数x [0] ... x [n-1]的数组,该数组的排序排列是另一个数组s [0] ... s [n-] 1] log_2(n)位唯一整数,使得x [s [0]] ... x [s [n-1]]是一个排序数组。

计算排序排列的显而易见的方法是使元组数组(x [i],i)在元组的第一个坐标上对其进行排序,然后进行第二个坐标投影。但是,在最糟糕的情况下,如果没有重复项,正在排序的元素是log_2(n)位长,这将使内存需求加倍,即使排序是就地排序。

问题:

  

存在哪些就地算法来计算排序排列?   只需要排列,而不是排序数据 - 它们可以   在分拣过程中被摧毁。

一种方法是使用LSB优先基数排序。在每次log_2(n)传递之后,每个条目的一个位可以被销毁(因为它不再需要它)。随着排序的进行,该位可用于逐步编码置换。当你完成后,你需要解码这个"排序跟踪"这是棘手和复杂的,但可能。基数排序也不会自动进行就地排序,因此存在额外的复杂性。

我主要是在文献中寻找立足点。搜索"排序排列"没有太多帮助。有更好的搜索词吗?甚至可能是一份调查报告?

我也对基于排序算法的方法感兴趣,这些算法很容易在extrenal内存模型中实现 - 理想情况下是合并排序。不幸的是,对于基于比较的排序,你不能得到"这个位可以被丢弃"保证从基数排序中自动生成。

如果重要,我实际上只需要找到原始数组中重复条目的所有索引,但我相信这是最坏情况渐近不比排序更容易。如果我错了,很高兴得到纠正。

谢谢!

编辑:需要是O(n log n)时间复杂度,或者非常接近它。排序不需要是稳定的排序。

0 个答案:

没有答案
相关问题