在一个熟悉的问题中,数组中的每个元素距离它的正确位置最多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)中完成 空间。
答案 0 :(得分:1)
基本思想是将堆存储在数组中,使用它对数组的其余元素进行排序,然后对堆部分本身进行排序。
这是使用可能更容易理解的min-heap的变体。
将数组的第一个k+1
元素合并到位。堆的最小元素将是整个数组的最小值。
k+1 | n-(k+1)
heap | unsorted
使用未排序部分的第一个元素交换堆的最小元素并重新堆积。
k+1 | 1 | n-(k+2)
heap | sorted | unsorted
重复步骤2,直到没有更多未处理的元素。此时,堆包含数组的k+1
个最大元素,其余元素按排序顺序。
k+1 | n-(k+1)
heap | sorted
对数组的堆部分进行排序
k+1 | n-(k+1)
sorted heap | sorted
将已排序的堆移动到数组的另一端。该数组现已排序。
n-(k+1)| k+1
sorted | sorted heap