树的应用 (堆排序,二叉排序树)

堆排序

堆排序是对选择排序的一种改进方法,在此首先引进堆的概念。堆的定义是满足下列性质的数列:这些数据排列成一棵完全二叉树,并且树中所有结点的值都要大于(或者小于)其左右孩子的值,此树的根结点就是堆顶,必定最大或者最小,对应的就是大顶堆和小顶堆

堆排序的算法思想是:将待排序数列整理成一个大顶堆,然后将堆顶数据与大顶堆的最后一个数据进行交换。接着再将除最后一个数据外的大数据调整为一个大顶堆,再将这个大顶堆的堆顶和最后一个数据进行交换。这样整个数列就从最右端开始逐渐向左有序化。 

该算法的核心包括两个:对初始序列建立为大顶堆交换堆顶数据后调整剩余部分为大顶堆

1.交换堆顶数据剩余部分为大顶堆:   交换大顶堆堆顶数据之后,发现此时根结点的左右子树分别是两个大顶堆,则将根结点的值取出待定,然后比较根结点的左右孩子,选择其中较大的那一个将它和根结点进行比较,如果根结点比它小,则将这个孩子结点的值赋给根结点。如果没有根结点的值大,那么就跳出循环。

2,令 i 从 i = H.length / 2;开始,当 i>0 时,循环调用HeapAdjust(H, i, H.length);函数就能建立一个大顶堆

#include<stdio.h>

//定义记录
typedef struct {
	int key;   //关键字
	char data;     //数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值