部分排序数组的最短时间?

时间:2016-05-16 16:34:10

标签: arrays algorithm sorting data-structures

我们得到一个部分排序的数组A,即for i=1, 2, ..., n-k我们有:

A[i]<= A[i+k]

为了完全排序数组,我们至少需要O(n log k)次。

使这条公理始终如此的条件和解决方案是什么?

1 个答案:

答案 0 :(得分:1)

你可以从这个问题中使用shell排序。在这个算法中,在每个阶段和一些增量hk之后,对于每个i,我们有一个[i]≤a[i + hk]。间隔hk的所有元素都被排序。据说这个数组是hk - 排序的。 shell排序的输出是1排序的。 如果数组是k-sorted那么shell排序需要O(log k)完全排序数组。每个阶段需要O(n),然后总阶数为O(n log k)。

假设我们要对这个数组进行排序:

enter image description here

这个数组是4排序的(k = 4)。为了排序这个,需要2个阶段 (h2 = 2,h3 = 1) 因此需要两个阶段(lg 4或lg k)。 在每个阶段,都有必须排序的n / k子阵列。每个子数组排序与插入排序。每个子数组的排序顺序是O(n)。 最后,总订单O(n * lg k)= O(n log k)。