64,654
社区成员
发帖
与我相关
我的任务
分享
//下面是我写的一个用最大堆排序的程序,有一个语法错误,应该是数组传值问题.
//麻烦大家帮我把这个语法错误改正确,算法本身对否不用管它.谢谢先..
//error:
//no matching function for call to `MaxHeap::HeapSort(int (*)[((unsigned int)((int)Size))], int&)'|
// candidates are: void MaxHeap::HeapSort(int*&, int)|
//下面是我的代码:
#include<iostream>
#include<ctime>
using namespace std;
const int DefaultSize = 100;
class MaxHeap
{
public:
MaxHeap(int sz);
int Parent(int i) { return i/2;}
int Left(int i) { return 2*i;}
int Right(int i) {return 2*i+1;}
void MaxHeapify(int& arr,int i); //保持最大堆性质...
void BuildMaxHeap(int& arr,int arrSize);
void HeapSort(int& arr,int arrSize);
private:
//int* maxHeap;
int currentSize; //maxHeapSize;
void Swap(int i,int j) {int t=i; i=j; j=t;}
};
MaxHeap::MaxHeap(int arrSize)
{
currentSize = arrSize;
}
void MaxHeap::MaxHeapify(int& arr,int i)
{
int l = Left(i), r = Right(i),largest; //left,right,largest
if (l<=currentSize && arr[l]>arr[i]) largest = l;
else largest = i;
if (r<=currentSize && arr[r]>arr[largest]) largest = r;
if (largest != i)
{
Swap(arr[i],arr[largest]);
MaxHeapify(arr,largest);
}
}
void MaxHeap::BuildMaxHeap(int& arr,int arrSize)
{
for (int i=arrSize/2;i>0;i--)
MaxHeapify(arr,i);
}
void MaxHeap::HeapSort(int& arr,int arrSize)
{
BuildMaxHeap(arr,arrSize);
for (int i=arrSize/2;i>1;i--)
{
Swap(arr[1],arr[i]);
currentSize--;
MaxHeapify(arr,1);
}
}
int main(void)
{
srand(unsigned(time(0)));
int Size = DefaultSize;
int array[Size];
for(int i=0;i<Size;i++)
array[Size] = rand()%10000;
MaxHeap maxHeap(Size);
maxHeap.HeapSort(array,Size);
for(int i=0;i<Size;i++)
{
cout<<array[i]<<" ";
if((i+1)%10 == 0)cout<<endl;
}
return 0;
}
/*谢谢大家了,谢谢1楼,2楼,3...回来看了一下,改了很多错误,大家看一下我改的正解的程序,改了的地方都有说明,
另谢谢ztz0223的提示及修改.很多都是我应该注意的,呵呵...我本来是分三个文件来写的,为文便大家看,就弄到一个文件了...^_^
大家还有什么建议,说了听听,我明天结帖,此楼以下灌水没分 ^_^
*/
#include<iostream>
#include<ctime>
using namespace std;
const int DefaultSize = 100;
class MaxHeap
{
public:
MaxHeap(int sz);
int Parent(int i) { return i/2;}
int Left(int i) { return 2*i;}
int Right(int i) {return 2*i+1;}
void MaxHeapify(int* arr,int i);
void BuildMaxHeap(int* arr,int arrSize);
void HeapSort(int* arr,int arrSize);
private:
//int* maxHeap;
int currentSize; //maxHeapSize;
void Swap(int &i,int &j) {int t=i; i=j; j=t;}
};
MaxHeap::MaxHeap(int arrSize)
{
currentSize = arrSize;
}
void MaxHeap::MaxHeapify(int *arr,int i)
{
int l = Left(i), r = Right(i),largest; //left,right,largest
if (l<=currentSize && arr[l]>arr[i]) largest = l;
else largest = i;
if (r<=currentSize && arr[r]>arr[largest]) largest = r;
if (largest != i)
{
Swap(arr[i],arr[largest]);
MaxHeapify(arr,largest);
}
}
void MaxHeap::BuildMaxHeap(int* arr,int arrSize)
{
for (int i=arrSize/2;i>=0;i--)
MaxHeapify(arr,i);
}
void MaxHeap::HeapSort(int* arr,int arrSize)
{
BuildMaxHeap(arr,arrSize);
//一开始我写成for (int i=arrSize/2;i>0;i--),害我对着书画图才发现这个错误,晕..
for (int i=arrSize;i>0;i--) //最后只有一个元素,不用比较了
{
Swap(arr[0],arr[i]); //以arr[0]作为最大堆的根
currentSize--; //堆的大小减1
MaxHeapify(arr,0);
}
}
int main(void)
{
srand(unsigned(time(NULL)));
int Size = DefaultSize;
int *array = new int[Size];
for(int i=0;i<Size;i++)
array[i] = rand()%1000;
cout<<"before sort"<<endl;
for(int i=0;i<Size;i++)
{
cout<<array[i]<<" ";
if((i+1)%10 == 0)cout<<endl;
}
MaxHeap maxHeap(Size-1); //这里应为Size-1,因为传Size的话就数组越界了..
maxHeap.HeapSort(array,Size-1);
cout<<endl<<"After sort"<<endl;
for(int i=0;i<Size;i++)
{
cout<<array[i]<<" ";
if((i+1)%10 == 0)cout<<endl;
}
delete [] array;
return 0;
}
#include<iostream>
#include<ctime>
using namespace std;
const int DefaultSize = 100;
class MaxHeap
{
public:
MaxHeap(int sz);
int Parent(int i) { return i/2;}
int Left(int i) { return 2*i;}
int Right(int i) {return 2*i+1;}
////////////////////////////////////////////
void MaxHeapify(int* arr,int i); //保持最大堆性质...
void BuildMaxHeap(int* arr,int arrSize);
void HeapSort(int* arr,int arrSize);
private:
//int* maxHeap;
int currentSize; //maxHeapSize;
///////////////////////////用引用,才能实现家交换!
void Swap(int &i,int &j) {int t=i; i=j; j=t;}
};
MaxHeap::MaxHeap(int arrSize)
{
currentSize = arrSize;
}
void MaxHeap::MaxHeapify(int *arr,int i)
{
int l = Left(i), r = Right(i),largest; //left,right,largest
if (l<=currentSize && arr[l]>arr[i]) largest = l;
else largest = i;
if (r<=currentSize && arr[r]>arr[largest]) largest = r;
if (largest != i)
{
Swap(arr[i],arr[largest]);
MaxHeapify(arr,largest);
}
}
void MaxHeap::BuildMaxHeap(int* arr,int arrSize)
{
for (int i=arrSize/2;i>0;i--)
MaxHeapify(arr,i);
}
void MaxHeap::HeapSort(int* arr,int arrSize)
{
BuildMaxHeap(arr,arrSize);
for (int i=arrSize/2;i>1;i--)
{
Swap(arr[1],arr[i]);
currentSize--;
MaxHeapify(arr,1);
}
}
int main(void)
{
srand(unsigned(time(0)));
int Size = DefaultSize;
///////////////////////////////////
int *array = new int[Size];
for(int i=0;i<Size;i++)
array[i] = rand()%10000;
MaxHeap maxHeap(Size);
maxHeap.HeapSort(array,Size);
for(int i=0;i<Size;i++)
{
cout<<array[i]<<" ";
if((i+1)%10 == 0)cout<<endl;
}
//////////////////////////////////////
delete []array;
return 0;
}
#include<iostream>
#include<ctime>
using namespace std;
const int DefaultSize = 100;
class MaxHeap
{
public:
MaxHeap(int sz);
int Parent(int i) { return i/2;}
int Left(int i) { return 2*i;}
int Right(int i) {return 2*i+1;}
void MaxHeapify(int* arr,int i); //保持最大堆性质...
void BuildMaxHeap(int* arr,int arrSize);
void HeapSort(int* arr,int arrSize);
private:
//int* maxHeap;
int currentSize; //maxHeapSize;
void Swap(int i,int j) {int t=i; i=j; j=t;}
};
MaxHeap::MaxHeap(int arrSize)
{
currentSize = arrSize;
}
void MaxHeap::MaxHeapify(int *arr,int i)
{
int l = Left(i), r = Right(i),largest; //left,right,largest
if (l<=currentSize && arr[l]>arr[i]) largest = l;
else largest = i;
if (r<=currentSize && arr[r]>arr[largest]) largest = r;
if (largest != i)
{
Swap(arr[i],arr[largest]);
MaxHeapify(arr,largest);
}
}
void MaxHeap::BuildMaxHeap(int* arr,int arrSize)
{
for (int i=arrSize/2;i>0;i--)
MaxHeapify(arr,i);
}
void MaxHeap::HeapSort(int* arr,int arrSize)
{
BuildMaxHeap(arr,arrSize);
for (int i=arrSize/2;i>1;i--)
{
Swap(arr[1],arr[i]);
currentSize--;
MaxHeapify(arr,1);
}
}
int main(void)
{
srand(unsigned(time(0)));
int Size = DefaultSize;
int array[Size];
for(int i=0;i<Size;i++)
array[Size] = rand()%10000;
MaxHeap maxHeap(Size);
maxHeap.HeapSort(array,Size);
for(int i=0;i<Size;i++)
{
cout<<array[i]<<" ";
if((i+1)%10 == 0)cout<<endl;
}
return 0;
}
void MaxHeap::HeapSort(int* const& arr,int arrSize) //note
{
BuildMaxHeap(arr,arrSize);
for (int i=arrSize/2;i>1;i--)
{
Swap(arr[1],arr[i]);
currentSize--;
MaxHeapify(arr,1);
}
}