开发者社区> 问答> 正文

对几乎排序的数组排序(元素错位不超过k)

最近有人问我这个面试问题:

您将得到一个几乎已排序的数组,因为每个N元素的错位可能不超过k正确排序顺序的位置。寻找一种时空高效的算法对数组进行排序。

我有以下O(N log k)解决方案。

让我们来表示arr[0..n)从索引0(包括)到N(不包括)的数组元素。

分类 arr[0..2k) 现在我们知道arr[0..k)它们处于最终的排序位置... ...但是arr[k..2k)可能仍然被放错位置k! 分类 arr[k..3k) 现在我们知道arr[k..2k)它们处于最终的排序位置... ...但arr[2k..3k)可能仍会被k 分类 arr[2k..4k) .... arr[ik..N)在完成排序之前,就完成了! 当您2k剩余的元素少于时,此最后一步可能会比其他步骤便宜 在每个步骤中,您最多要对中的2k元素进行排序,请O(k log k)至少k在每个步骤的末尾将元素置于其最终排序位置。有O(N/k)步骤,因此总体复杂度为O(N log k)。

我的问题是:

是O(N log k)最优的吗?这可以改善吗? 您能做到这一点而无需(部分)重新排序相同的元素吗? 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 13:05:26 463 0
1 条回答
写回答
取消 提交回答
  • 已经指出,一种渐近最优的解决方案使用最小堆,我只想提供Java代码:

    public void sortNearlySorted(int[] nums, int k) { PriorityQueue minHeap = new PriorityQueue<>(); for (int i = 0; i < k; i++) { minHeap.add(nums[i]); }

    for (int i = 0; i < nums.length; i++) { if (i + k < nums.length) { minHeap.add(nums[i + k]); } nums[i] = minHeap.remove(); } }

    2020-02-09 13:05:43
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载