堆排序
堆排序是对选择排序的一种改进方法,在此首先引进堆的概念。堆的定义是满足下列性质的数列:让这些数据排列成一棵完全二叉树,并且树中所有结点的值都要大于(或者小于)其左右孩子的值,此树的根结点就是堆顶,必定最大或者最小,对应的就是大顶堆和小顶堆。
堆排序的算法思想是:将待排序数列整理成一个大顶堆,然后将堆顶数据与大顶堆的最后一个数据进行交换。接着再将除最后一个数据外的大数据调整为一个大顶堆,再将这个大顶堆的堆顶和最后一个数据进行交换。这样整个数列就从最右端开始逐渐向左有序化。
该算法的核心包括两个:对初始序列建立为大顶堆和交换堆顶数据后调整剩余部分为大顶堆。
1.交换堆顶数据剩余部分为大顶堆: 交换大顶堆堆顶数据之后,发现此时根结点的左右子树分别是两个大顶堆,则将根结点的值取出待定,然后比较根结点的左右孩子,选择其中较大的那一个将它和根结点进行比较,如果根结点比它小,则将这个孩子结点的值赋给根结点。如果没有根结点的值大,那么就跳出循环。
2,令 i 从 i = H.length / 2;开始,当 i>0 时,循环调用HeapAdjust(H, i, H.length);函数就能建立一个大顶堆
#include<stdio.h>
//定义记录
typedef struct {
int key; //关键字
char data; //数据