堆排序算法
堆排序
#include <iostream>
using namespace std;
int tempnum;
void KeepCharacter(int *data,int n,int num) //保持性质函数,保证是一个大根推;
{
int left=n*2;
int right=n*2+1;
int max; //记录最大的数字的位置;
if(left<=num&&data[n]<data[left]) //比较根与左孩子大小,挑出一个比较大的数
max=left;
else
max=n;
if(right<=num&&data[max]<data[right]) //比较局部极大值与右孩子,挑出一个最大值
max=right;
if(max!=n)
{
int temp=data[max];
data[max]=data[n];
data[n]=temp;
KeepCharacter(data,max,num); //调整后子树有可能不满足性质,应该递归调用;
}
}
void HeapSort(int *data,int num)
{
for(int i=num/2;i>=1;i--) //建堆调用
KeepCharacter(data,i,num);
for(int i=num;i>=2;i--)
{
int temp=data[1];
data[1]=data[i];
data[i]=temp;
num-=1;
KeepCharacter(data,1,num);
}
}
int main()
{
int num;
cout<<"Please input the num of data:"<<endl;
cin>>num;
cout<<"Please input data:"<<endl;
int *data=new int[num+1];
for(int i=1;i<=num;i++)
cin>>data[i];
for(int i=num/2;i>=1;i--) //建堆调用
KeepCharacter(data,i,num);
HeapSort(data,num);
cout<<"After sorted:"<<endl;
for(int i=1;i<=num;i++)
cout<<data[i]<<" ";
cout<<endl;
}
最初版本:
#include <iostream>
using namespace std;
void KeepCharacter(int *data,int n,int num) //保持性质函数,保证是一个大根推;
{
int left=n*2;
int right=n*2+1;
int max; //记录最大的数字的位置;
if(left<=num&&data[n]<data[left]) //比较根与左孩子大小,挑出一个比较大的数
max=left;
else
max=n;
if(right<=num&&data[max]<data[right]) //比较局部极大值与右孩子,挑出一个最大值
max=right;
if(max!=n)
{
int temp=data[max];
data[max]=data[n];
data[n]=temp;
KeepCharacter(data,max,num); //调整后子树有可能不满足性质,应该递归调用;
}
}
void HeapSort(int *data,int tempnum)
{
int temp=data[tempnum];
data[tempnum]=data[1];
data[1]=temp;
tempnum-=1;
for(int i=tempnum/2;i>=1;i--)
KeepCharacter(data,i,tempnum);
}
int main()
{
int num;
cout<<"Please input the num of data:"<<endl;
cin>>num;
cout<<"Please input data:"<<endl;
int *data=new int[num+1];
for(int i=1;i<=num;i++)
cin>>data[i];
for(int i=num/2;i>=1;i--) //建堆调用
KeepCharacter(data,i,num);
int tempnum=num;
for(int i=num;i>=2;i--) //堆排序过程
{
HeapSort(data,tempnum);
tempnum--;
}
cout<<"After sorted:"<<endl;
for(int i=1;i<=num;i++)
cout<<data[i]<<" ";
cout<<endl;
}
态度决定高度,细节决定成败,

浙公网安备 33010602011771号