用堆排序的一些问题..

Non_Recursive 2008-11-29 09:25:58

//下面是我写的一个用最大堆排序的程序,有一个语法错误,应该是数组传值问题.
//麻烦大家帮我把这个语法错误改正确,算法本身对否不用管它.谢谢先..
//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;
}

...全文
157 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Non_Recursive 2008-11-30
  • 打赏
  • 举报
回复

/*谢谢大家了,谢谢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;
}

就呆在云上 2008-11-30
  • 打赏
  • 举报
回复
程序帮你改过来了,错误地方不少,貌似你的算法不够好,注释处就是修改的:
#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;
}

yshuise 2008-11-30
  • 打赏
  • 举报
回复
向上面有些人那样改可以,就是把引用改为指针。如果是引用需要知道数组的维数。
WingForce 2008-11-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhaoboif 的回复:]
int Size = DefaultSize;
int array[Size];
数组 好像不能用变量定义大小吧
[/Quote]
C99允许
Non_Recursive 2008-11-30
  • 打赏
  • 举报
回复
嗯,嗯....

那就结帖吧..^_^
就呆在云上 2008-11-30
  • 打赏
  • 举报
回复
要结贴就今天结
哈哈
明天又是一个月12月了
哈哈
其实楼主能自己写这么长的程序已经非常不错了
继续加油
zhaoboif 2008-11-29
  • 打赏
  • 举报
回复
int Size = DefaultSize;
int array[Size];
数组 好像不能用变量定义大小吧
liubuweiright 2008-11-29
  • 打赏
  • 举报
回复
xhs_lh04 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 WingForce 的回复:]
C/C++ codevoid 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);
}
}
[/Quote]
UP
tangshuiling 2008-11-29
  • 打赏
  • 举报
回复
楼主自己看看:

#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;
}



WingForce 2008-11-29
  • 打赏
  • 举报
回复
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);
}
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧