[英]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.