c++堆排序混淆

C++ heapsort confusion

本文关键字:堆排序 c++      更新时间:2023-10-16

这可能是一个奇怪的问题,但我想弄清楚为什么下面的代码工作。

似乎这段代码应该用于堆元素索引从1开始,但它从0开始,并且正确完成排序。

我这么说是因为左子元素是(element*2),右子元素是(element*2 + 1)。这将使得索引为0的元素的左子元素也具有索引0。

#include <iostream>
using namespace std;
void siftDown(int numbers[], int root, int bottom) {
    int done, maxChild, temp;
    done = 0;
    while ((root*2 <= bottom) && (!done)) {
        if (root*2 == bottom)
            maxChild = root * 2;
        else if (numbers[root*2] > numbers[root*2 + 1])
            maxChild = root * 2;
        else
            maxChild = root * 2 + 1;
        if (numbers[root] < numbers[maxChild]) {
            temp = numbers[root];
            numbers[root] = numbers[maxChild];
            numbers[maxChild] = temp;
            root = maxChild;
        } else {
            done = 1;
        }
    }
}
void heapSort(int numbers[], int n) {
    int i, temp;
    for (i = n/2; i >= 0; i--) {
        siftDown(numbers, i, n - 1);
    }
    for (i = n-1; i >= 1; i--) {
        temp = numbers[0];
        numbers[0] = numbers [i];
        numbers [i] = temp;
        siftDown(numbers, 0, i-1);
    }
}
int main() {
    int cases;
    int n;
    int count;
    cin >> cases;
    for (int i=0; i < cases; i++) {
        cin >> n;
        int array[n];
        for (int j=0; j < n; j++) {
            cin >> array[j];
        }
        heapSort(array, n);
        for (int k=0; k < n; k++) {
            cout << array[k];
        }    
        cout << endl;
    }
}

对于根= 0的情况,有两种子情况:数字[0]>数字[1],或不。在第一个中,maxchild被设置为0。下一个"if"子句——实际上是"number [0]

如果numbers[1]>= numbers[0],则maxchild设置为1。下一个子句变成"numbers[0]

我认为最简单的方法是将这种情况视为根节点只有一个子节点的堆(所有其他节点通常都有两个子节点)。