//小顶堆的建立
#include<iostream>
using namespace std;
void BuildStack(int *p,int n,int m)//建立堆
{
if(*(p+n)<=*(p+2*n)&&*(p+n)<=*(p+(2*n+1)))
return ;
else
{
int num;
if(2*n+1>m)//如果要排序的个数为偶数个时候使用到
{
if(*(p+n)>*(p+2*n))
{
num=*(p+n);
*(p+n)=*(p+2*n);
*(p+2*n)=num;
}
}
else
{
if(*(p+2*n)<*(p+(2*n+1)))//父亲节点要满足大于两个子节点
{
if(*(p+n)>*(p+2*n))
{
num=*(p+n);
*(p+n)=*(p+2*n);
*(p+2*n)=num;
if(4*n<m)
BuildStack(p,2*n,m);//递归保证每个n都满足小顶堆的定义
}
}
else
{
if(*(p+n)>*(p+(2*n+1)))
{
num=*(p+n);
*(p+n)=*(p+(2*n+1));
*(p+(2*n+1))=num;
if(4*n<m)
BuildStack(p,2*n+1,m);//递归保证每个n都满足小顶堆的定义
}
}
}
}
}
void Sort(int *p,int n,int m)//寻找堆内最小元素
{
int num;
while(2*n<=m)
{
if(2*n+1>m)//如果某个父亲节点只有左孩子
{
if(*(p+n)>*(p+2*n))
{
num=*(p+n);
*(p+n)=*(p+2*n);
*(p+2*n)=num;
}
break;
}
else
{
if(*(p+n)<=*(p+2*n)&&*(p+n)<=*(p+(2*n+1)))//节点找到自己的位置
break;
else
{
if(*(p+2*n)>*(p+(2*n+1)))
{
num=*(p+n);
*(p+n)=*(p+(2*n+1));
*(p+(2*n+1))=num;
n=2*n+1;
}
else
{
num=*(p+n);
*(p+n)=*(p+2*n);
*(p+2*n)=num;
n=2*n;
}
}
}
}
}
int main()
{
int i,n;
int a[20],b[20];
int head,tail;
int num;
cin>>n;
head=1;
tail=n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=n/2;i>0;i--)
BuildStack(a,i,n);
cout<<"第1次排序"<<":";
for(i=1;i<=n;i++)
cout<<a[i]<<",";
cout<<endl;
b[1]=a[1];
for(tail=n;tail>0;tail--)
{
a[1]=a[tail];
Sort(a,1,tail);
cout<<"第"<<n-tail+2<<"次排序"<<":";//对每次重构堆输出
for(i=1;i<=tail;i++)
cout<<a[i]<<",";
cout<<endl;
b[n-tail+2]=a[1];
}
for(i=1;i<=n;i++)//输出排序结果
cout<<b[i]<<",";
cout<<endl;
return 0;
}
堆排序问题.
最新推荐文章于 2023-10-05 22:35:14 发布
刚开始学习数据结构。关于堆排的实现。