【发布时间】:2011-12-03 00:40:52
【问题描述】:
对于一个班级,我正在分配从命令行获取输入并使用输入创建堆树的任务。数字是从命令行读入的。
例如:
示例输入:
./Heapify 2 9 7 6 5 8
样本输出:
9 6 8 2 5 7
我做了这么多工作,似乎每个输入 6 个或更少的数字都可以正常工作。当输入是 7 个或更多数字时:
示例输入:
./Heapify 3 10 8 7 5 9 6
我的输出:
32767 10 9 6 8 7 5
出了点问题。显然,我要么在我的程序中使用大量内存并获得一个“废话”数字,要么我正在访问我的数组之外的内存,这会导致另一个“废话”数字。我一直在考虑可能出了什么问题,但我不确定。任何帮助,将不胜感激。
如果您有任何疑问或需要澄清,请随时提出。
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
void heap(int *array, int n);
int main(int argc, char* argv[]){
int array[argc+1];
int length = argc+1;
for(int i = 1; i < length-1; i++){
array[i]=atoi(argv[i]);
}
array[0]= -1;
cout << "unheapified array: ";
for(int k = 1; k < length-1; k++){
cout << array[k] << " ";
}
cout << endl;
heap(array, length);
cout << "heapified array: ";
for(int k = 1; k < length-1; k++){
cout << array[k] << " ";
}
cout << endl;
return 0;
}
void heap(int *array, int n){
int i, v, j,k;
bool heap;
for(int i=(n/2); i>0; --i){
k = i;
v = array[k];
heap = false;
while(heap == false && (2*k) <= n-1){
j = 2*k;
if(j<n){
if(array[j] < array[j+1])
j += 1;
}
if (v >= array[j])
heap = true;
else{
array[k] = array[j];
k = j;
}
}
array[k] = v;
}
}
【问题讨论】:
-
您是否尝试过在调试器中单步执行您的代码?还是打印出中间值?
-
您在数组中浪费了 1 个索引;
array[0]从未使用过。 :( -
我正在使用 SSH 来编码,你知道如何使用调试器的教程吗?
-
非常量大小的数组在 C++ 中是非标准的(但在 C99 中是标准的)。我建议你改用矢量。
-
@AusCBloke 我不能使用数组[0],因为当您尝试在函数中执行 for 循环时,2*0 为 0,因此您不会做任何事情,也不会交换任何内容。跨度>
标签: c++ arrays algorithm heap binary-tree