可以使用堆在O(1)空间中完成k-messed-array排序

时间:2016-11-06 19:40:25

标签: arrays algorithm sorting heap

在一个熟悉的问题中,数组中的每个元素距离它的正确位置最多k个位置,无论是向左还是向右,最小堆实现如下。

  

创建一个大小为k + 1的最小堆。所以,最小堆的根是   排序数组的最小元素。对于剩余的n-(k + 1)   元素,在每次迭代中,选择在a [i]和   已经在堆中的元素。所以在堆中插入一个[i],   堆积,并提取最小值。这将继续填充a [i-k]   排序数组的元素。

     

时间复杂度:O(k)+ O(n-k).log(k)

     

空间复杂度:O(k)

我的问题是:这可以使用O(1)空间复杂度来完成吗?

我找到了一种方法here,但却感觉不到。有人可以详细说明吗?

  

您可以就地执行此操作。从远端开始,使用max-heap   而不是最小堆。将最后一块2k元素重新绑定   到位。将第一个提取的元素存储在变量中;随后   元素进入决赛前的空位   块2k(包含堆结构),类似于常规   堆排序。当只剩下一个块时,将其固定到位。决赛   需要O(n)传递以将最终块“旋转”回初始值   块。旋转不是微不足道的,但可以在O(n)和O(1)中完成   空间。

1 个答案:

答案 0 :(得分:1)

基本思想是将堆存储在数组中,使用它对数组的其余元素进行排序,然后对堆部分本身进行排序。

这是使用可能更容易理解的min-heap的变体。

  1. 将数组的第一个k+1元素合并到位。堆的最小元素将是整个数组的最小值。

    k+1  | n-(k+1)
    heap | unsorted
    
  2. 使用未排序部分的第一个元素交换堆的最小元素并重新堆积。

    k+1  | 1      | n-(k+2)
    heap | sorted | unsorted
    
  3. 重复步骤2,直到没有更多未处理的元素。此时,堆包含数组的k+1个最大元素,其余元素按排序顺序。

    k+1  | n-(k+1)
    heap | sorted
    
  4. 对数组的堆部分进行排序

    k+1         | n-(k+1)
    sorted heap | sorted
    
  5. 将已排序的堆移动到数组的另一端。该数组现已排序。

    n-(k+1)| k+1
    sorted | sorted heap