我们得到一个部分排序的数组A,即for i=1, 2, ..., n-k
我们有:
A[i]<= A[i+k]
为了完全排序数组,我们至少需要O(n log k)
次。
使这条公理始终如此的条件和解决方案是什么?
答案 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)。
假设我们要对这个数组进行排序:
这个数组是4排序的(k = 4)。为了排序这个,需要2个阶段 (h2 = 2,h3 = 1) 因此需要两个阶段(lg 4或lg k)。 在每个阶段,都有必须排序的n / k子阵列。每个子数组排序与插入排序。每个子数组的排序顺序是O(n)。 最后,总订单O(n * lg k)= O(n log k)。