参考啊哈算法第七章第三节
与快速排序一样,堆排序时间复杂度也是O(N*logN)
由小到大排序:(最小堆)
#include <stdio.h>
int h[101];
int n;
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
return;
}
void siftdown(int i)
{
int t,flag=0;
while(2*i<=n&&!flag)
{
if(h[i]>h[2*i])
t=2*i;
else
t=i;
if(2*i+1<=n)
if(h[2*i+1]<h[t])
t=2*i+1;
if(t!=i)
{
swap(i,t);
i=t;
}
else
flag=1;
}
return ;
}
void creat()
{
for(int i=n/2;i>=1;i--)
siftdown(i);
return;
}
int deletemax()
{
int t;
t=h[1];
h[1]=h[n];
n--;
siftdown(1);
return t;
}
int main()
{
int num;
scanf("%d",&num);
for(int i=1;i<=num;i++)
scanf("%d",&h[i]);
n=num;
creat();
for(int i=1;i<=num;i++)
printf("%3d",deletemax());
printf("\n");
return 0;
}
由小到大排序(最大堆)
#include <stdio.h>
int h[101];
int n;
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
return;
}
void siftdown(int i)
{
int t,flag=0;
while(2*i<=n&&!flag)
{
if(h[i]<h[2*i])
t=2*i;
else
t=i;
if(2*i+1<=n)
if(h[2*i+1]>h[t])
t=2*i+1;
if(t!=i)
{
swap(i,t);
i=t;
}
else
flag=1;
}
return ;
}
//创建堆函数
void creat()
{
for(int i=n/2;i>=1;i--)
siftdown(i);
return;
}
//堆排序
void heapsort()
{
while(n>1)
{
swap(1,n);
n--;
siftdown(1);
}
return;
}
int main()
{
int num;
scanf("%d",&num);
for(int i=1;i<=num;i++)
scanf("%d",&h[i]);
n=num;
//建堆
creat();
//堆排序
heapsort();
for(int i=1;i<=num;i++)
printf("%3d",h[i]);
printf("\n");
return 0;
}