繁体   English   中英

C ++堆排序混乱

[英]C++ heapsort confusion

这可能是一个奇怪的问题,但是我试图弄清楚以下代码为什么起作用。

似乎应该在堆元素索引从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;
    }
}

对于root = 0的情况,有两个子情况:是否为numbers [0]> numbers [1]。 首先,将maxchild设置为0。下一个“ if”子句-有效的“ numbers [0] <numbers [0]”-的求值必须为false,因此将“ done”设置为1并终止循环。

如果数字[1]> =数字[0],则将maxchild设置为1。下一个子句变为“数字[0] <数字[1]”,如果数字[0] ==数字,则可能为true或为false [1]。 如果为假,则循环将像以前一样终止。 如果为true,则将数字[0]和数字[1]交换-从而较大的数字正确移动到堆的顶部-且root变为1,循环继续进行,在这种情况下,您了解其工作方式。

我认为将这种情况视为最简单的情况是堆,其中根仅具有一个子节点(所有其他节点照常具有两个子节点)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM