algorithm - 构建堆时,堆是否唯一?

标签 algorithm data-structures heap

我正在研究堆和堆排序。
有一个数组:arr[8] = {6,9,3,1,8,7,2,11}
当我尝试使用代码和铅笔构建堆时,我遇到了两种堆。

使用代码时, 最大堆:11 9 7 6 8 3 2 1

当使用插入理论时,MaxHeap:11 9 7 8 6 3 2 1


我正在使用的代码:

int[] DoHeapSort(int[] value) {
    int length = value.length;

    for (int i = length / 2; i > 0; i--) {
        maxHeapify(value, i, length);
    }

    //print Heap
    for(int i = 0 ; i<value.length; i++)
        System.out.println(value[i]);

    return (value);
}


void maxHeapify(int[] array, int index, int heapSize) {
    int left = index * 2;
    int right = left + 1;
    int max = index;

    if (left <= heapSize && array[left - 1] > array[index - 1]) {
        max = left;
    }

    if (right <= heapSize && array[right - 1] > array[max - 1]) {
        max = right;
    }

    if (max != index) {
        swap(array, index - 1, max - 1);
        maxHeapify(array, max, heapSize);
    }
}

理论,本例中,再创建一个堆数组,从6到11依次插入。 (另一方面,代码是就地堆)

两个 maxHeap 结果都满足堆定义。那么 Heap 不是唯一的吗?谢谢

最佳答案

没错。堆约束(即子代不大于其父代)并未完全指定堆,因此通常有不止一种可能的安排。

关于algorithm - 构建堆时,堆是否唯一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30552777/

相关文章:

arrays - 用于进行数组计算的 Pythonic 算法

algorithm - 如何绘制树结构? (二维空间分配树递归算法?)

algorithm - 数据结构 Parallel Add Serial Remove Needed

python - 基于使用标准逻辑运算(如 AND、OR、XOR、NOT)将两个整数相加的算法

algorithm - 给定一组区间 S。你必须以最小时间复杂度找到 S 中包含在给定区间 (a, b) 中的所有区间

list - 这段 Haskell 代码高效吗?

c# - 堆排序问题

algorithm - d-heap 如何在 O(log n) 中执行插入和删除?

c - 代码的时间复杂度或大O

ruby - 在 Ruby 中实现数组的 to_s