如何在C++中实现最小堆
how to implement minimum heap in c++
我必须将文件中的所有数据(整数)读入数组,然后迭代数组以生成最小堆并将它们添加到当前堆的最后一个元素之后。读入数组后,我必须调用 SiftUp()
。在每个 element.At 所有输入的末尾,我试图打印出最小堆数组的前五个元素。输出给我以下错误。
发生错误:
[Error] invalid conversion from 'int' to 'int*' [-fpermissive]
我的程序:
using namespace std;
int heapSize;
void SiftUp(int arr[], int heapSize);
const int arr_Size=500;
int heapArr[arr_Size];
int main()
{
int integers;
string fileName;
ifstream infile;
cout << "Please enter the name of the file to open :";
cin >> fileName;
infile.open(fileName.c_str());
if(!infile)
{
cerr << "An eror occurred while openieng the file.";
exit(1);
}
while(!infile.eof())
{
for (int i=0; i<arr_Size; i++)
{
infile >> integers;
heapArr[i]=integers;
heapSize=i;
cout << "numbers " << heapArr[i] << endl;
SiftUp(heapArr[i],heapSize); // Error: invalid conversion
}
}
infile.close();
return 0;
}
void SiftUp(int arr[], int heapSize)
{
int p;
if (heapSize==1)
return;
else p = heapSize/2;
if (arr[p] > arr[heapSize])
return;
else swap (arr[heapSize],arr[p]);
SiftUp(arr[], p); // Error : expected primary-expression before ']'
for (int count =0 ; count <5 ; count ++)
{
cout << " at index 1 : " << arr[count] << endl;
}
}
请阅读这篇关于变色龙问题的 post。 https://meta.stackexchange.com/questions/43478/exit-strategies-for-chameleon-questions现在回到当前问题。
void SiftUp(int arr[], int heapSize);
您的函数需要一个数组,然后是一个整数。
SiftUp(heapArr[i],heapSize);
您将一个 int 和一个 int 传递给您的函数。编译器拒绝将您的 int 重新解释为 int* (因为这样做是一个糟糕的主意)。尝试将一个数组和一个整数传递给您的函数。
SiftUp(heapArr,heapSize);
这是关于 C++ 数组的参考。 http://www.cplusplus.com/doc/tutorial/arrays/
int i;
for (i=1; i<arr_Size; i++){
infile >> integer;
if(infile.fail())break;
heapArr[i]=integer;
SiftUp(i);
}
infile.close();
heapSize=i;
for (int count =1 ; count <=5 ; count ++){
cout << count <<" :"<< heapArr[count] << endl;
}
return 0;
}
void SiftUp(int heapSize){
int p;
if (heapSize==1) return;
p = heapSize/2;
if (heapArr[p] < heapArr[heapSize]) return;
swap (heapArr[heapSize],heapArr[p]);
SiftUp(p);
}
我必须将文件中的所有数据(整数)读入数组,然后迭代数组以生成最小堆并将它们添加到当前堆的最后一个元素之后。读入数组后,我必须调用 SiftUp()
。在每个 element.At 所有输入的末尾,我试图打印出最小堆数组的前五个元素。输出给我以下错误。
发生错误:
[Error] invalid conversion from 'int' to 'int*' [-fpermissive]
我的程序:
using namespace std;
int heapSize;
void SiftUp(int arr[], int heapSize);
const int arr_Size=500;
int heapArr[arr_Size];
int main()
{
int integers;
string fileName;
ifstream infile;
cout << "Please enter the name of the file to open :";
cin >> fileName;
infile.open(fileName.c_str());
if(!infile)
{
cerr << "An eror occurred while openieng the file.";
exit(1);
}
while(!infile.eof())
{
for (int i=0; i<arr_Size; i++)
{
infile >> integers;
heapArr[i]=integers;
heapSize=i;
cout << "numbers " << heapArr[i] << endl;
SiftUp(heapArr[i],heapSize); // Error: invalid conversion
}
}
infile.close();
return 0;
}
void SiftUp(int arr[], int heapSize)
{
int p;
if (heapSize==1)
return;
else p = heapSize/2;
if (arr[p] > arr[heapSize])
return;
else swap (arr[heapSize],arr[p]);
SiftUp(arr[], p); // Error : expected primary-expression before ']'
for (int count =0 ; count <5 ; count ++)
{
cout << " at index 1 : " << arr[count] << endl;
}
}
请阅读这篇关于变色龙问题的 post。 https://meta.stackexchange.com/questions/43478/exit-strategies-for-chameleon-questions现在回到当前问题。
void SiftUp(int arr[], int heapSize);
您的函数需要一个数组,然后是一个整数。
SiftUp(heapArr[i],heapSize);
您将一个 int 和一个 int 传递给您的函数。编译器拒绝将您的 int 重新解释为 int* (因为这样做是一个糟糕的主意)。尝试将一个数组和一个整数传递给您的函数。
SiftUp(heapArr,heapSize);
这是关于 C++ 数组的参考。 http://www.cplusplus.com/doc/tutorial/arrays/
int i;
for (i=1; i<arr_Size; i++){
infile >> integer;
if(infile.fail())break;
heapArr[i]=integer;
SiftUp(i);
}
infile.close();
heapSize=i;
for (int count =1 ; count <=5 ; count ++){
cout << count <<" :"<< heapArr[count] << endl;
}
return 0;
}
void SiftUp(int heapSize){
int p;
if (heapSize==1) return;
p = heapSize/2;
if (heapArr[p] < heapArr[heapSize]) return;
swap (heapArr[heapSize],heapArr[p]);
SiftUp(p);
}