#include<stdio.h>
#include<stdlib.h>
#define Status int
#define max 20
typedef struct {
Status key;
}ElemType;
typedef struct {
ElemType r[max];
int length;
}Sqlist;
void Inital(Sqlist &L)//初始化
{
L.r[1].key=49;
L.r[2].key=38;
L.r[3].key=65;
L.r[4].key=97;
L.r[5].key=76;
L.r[6].key=13;
L.r[7].key=27;
L.r[8].key=49;
L.length=8;
}
bool LT(int i,int j)
{
if(i<j)
return true;
else return false;
}
void HeapAdjust(Sqlist &h,int s,int m)//筛选函数(通过筛选建立一个初始堆)
{
ElemType rc; int i,j;
rc=h.r[s]; //rc用于暂存根节点
for(j=s*2;j<=m;j*=2)
{
if(j<m&<(h.r[j].key,h.r[j+1].key)) ++j; //比较s位置的两个叶子节点大小,如果左叶子节点比右叶子节点小,j++(j始终代表大的一个节点)
if(!LT(rc.key,h.r[j].key)) break; //如果根节点比最大的一个叶子节点大的话就退出for循环,不用换位置了
h.r[s]=h.r[j]; s=j; //根节点比大叶子节点小,将大叶子节点赋值给根节点,
}
h.r[s]=rc; //将原根节点赋值给s
}
void HeapSort(Sqlist &h) //大根堆排序(将第一个和最后一个元素换位置,重新筛选出初始堆,再换位置,再筛选。。。。)
{
int i;ElemType rc;
for(i=h.length/2;i>0;--i) //筛选初始堆的时候,在第n/2个节点之前的才是有叶子节点的,所以从第n/2开始递减筛选
HeapAdjust(h,i,h.length);
for(i=h.length;i>1;--i){ //将第一个和最后一个换位置
rc=h.r[1];
h.r[1]=h.r[i];
h.r[i]=rc;
HeapAdjust(h,1,i-1); //换位之后再重建大根堆
}
}
void print(Sqlist l)
{
int i;
printf("排序后的结果为:");
for(i=1;i<=l.length;i++)
{
printf("%d ",l.r[i].key);
}
}
void main()
{
Sqlist h;
Inital(h);
HeapSort(h);
print(h);
getchar();
getchar();
}
//算法分析:1.堆排序最坏时间复杂度为O(nlogn)
//2.建立初始堆所需的比较次数多,不适合记录少的序列排序
//3.堆排序不是稳定的排序
排序算法-------堆排序(大根堆)
最新推荐文章于 2024-10-04 13:32:19 发布