相关疑难解决方法(0)

对几乎排序的数组进行排序(错误放置的元素不超过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)最佳的?这可以改进吗?
  • 你可以在没有(部分)重新排序相同元素的情况下做到这一点吗?

arrays sorting algorithm

65
推荐指数
5
解决办法
3万
查看次数

标签 统计

algorithm ×1

arrays ×1

sorting ×1