排序算法-------堆排序(大根堆)

#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.堆排序不是稳定的排序

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值