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;
}
}
对于根= 0的情况,有两种子情况:数字[0]>数字[1],或不。在第一个中,maxchild被设置为0。下一个"if"子句——实际上是"number [0]
如果numbers[1]>= numbers[0],则maxchild设置为1。下一个子句变成"numbers[0]
我认为最简单的方法是将这种情况视为根节点只有一个子节点的堆(所有其他节点通常都有两个子节点)。
相关文章:
- 无法在我的堆排序代码中找到错误.无法正确执行.C++
- 堆排序,我无法弄清楚我的代码出了什么问题,输出顺序不正确
- 堆排序它不起作用或计算不正确
- 试图做堆排序,但被卡住了
- treap 中的轮换会违反它的堆排序或二叉搜索树顺序吗?
- 计算在堆排序中完成的比较次数
- 堆排序和插入排序
- 堆排序未产生正确的输出
- 结构的堆排序
- C++堆排序引发错误
- 堆排序CPU时间
- 提高循环缓冲区或堆排序性能
- C++堆排序算法在4100多个数据条目后崩溃
- 为什么我的堆排序比 Java 和 C++ 的排序函数快
- 堆排序 - 实现的复杂性
- Introsort(快速排序+堆排序)实现和复杂性
- 堆排序,堆"correctness"
- 堆排序-为什么PercolateDown()中的循环迭代(length/2)次
- 在堆排序中迭代max heapify
- 堆排序从介绍到算法在c++中使用向量实现