选择排序之----堆排序

排序是简单选择排序的改进,是一种不稳定的排序方法。

基本思路:对一组待排序的记录序列,先将其关键字按堆的定义排列一个序列(称为初建堆),找到最小(最大)关键字后,将其取出。用剩余的n-1个元素再重建堆,便可得到次小(次大)值。如此反复执行,直到全部关键字排好序为止。

#include<stdio.h>
#define Type int
#define MARK 0       //占据a[0],不起实际作用
#define NUM 6
#define Num NUM - 1  //实际要排序的数

void print(Type A[])
{
	int i;
	for(i = 1; i< NUM; i++)
		printf("%d ", A[i]);
	printf("\n");
}

void adjust(Type *buf, int t,int w)
{
	int i,j;
	Type x;
	i = t;
	x = buf[i];  //待筛选的值存放在辅助单元中
	j = 2*i ;    //buf[j] 是buf[i]的左孩子
	while(j<=w)  //确定不越界
	{
		if((j < w)&&(buf[j] > buf[j + 1])) //若存在右子树且右子树的关键值小,则从右分支筛选,
			j++;						   //否则从左子树筛选
		if(x > buf[j])                     //若待筛选的值大于子树的值
		{
			buf[i] = buf[j];               //进行对调
			i = j;
			j = 2*j;                       //继续搜索
		}
		else
		{
			break;                         //根不大于他的孩子的值,调整完毕,退出循环
		}
	}
	buf[i] = x;                            //将待排序的值放入恰当的位置
}

void heap_sort(Type *buf, int n)
{
	int i;
	Type x;
	for(i = n/2;i >= 0; i--)   //初建堆
		adjust(buf, i, n);

	//初始化堆的输出
	printf("初始化堆的输出:");  
	print(buf);

	for(i = n; i > 1; i--)     //进行n-1趟排序
	{
		x = buf[1];            //将第一个记录和当前堆中最后一个记录互换
		buf[1] = buf[i];
		buf[i] = x;

		adjust(buf,1,i-1);     //已经筛选buf[1]结点,得到具有n-1个结点的堆。

		//重建堆的输出
		printf("第%2d次重建堆的输出:",(NUM - i));
		print(buf);
	}
}
int main()
{
	Type num[NUM] = {MARK,1,32,2,12,23}; 

	printf("Original array:");
	print(num);

	heap_sort(num,Num);  //Num = NUM - 1

	printf("Sorted array:");
	print(num);
	return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值