堆排序原理
1)堆的定义
堆(二叉堆)可以看作是一棵完全二叉树,即除了最后一层,每一层都是满的。这个性质使我们可以用一个数组来存储一个堆。如图是二叉树在数组中的存储。
2)大顶堆和小顶堆
大顶堆:每个节点的都值大于或等于其左右孩子的值的堆,如图:
小顶堆:每个结点的值都小于或等于其左右孩子的值的堆,如图:
3)堆排序的实现过程
堆排序就是将一个无序的数组中的元素看作是一个无序堆,然后将这个无序堆维护成一个有序的大顶堆或小顶堆。这样就可以在顶部产生出一个最大值或最小值。然后把顶部的值与最后一个值进行交换,交换后断开最后1个元素,对剩下的数继续进行维护,交换,断开。重复以上过程,直到最后一个元素。
一个无序的数组就变成了一个有序的数组。堆排序实现的平均时间复杂度为O(nlogn)。
升序采用大顶堆
降序采用小顶堆
以下我将用大顶堆做升序示例:
如图的一个数组从最后一个元素开始维护,第一个需要维护的是12,12比它的左结点小,所以我们让12和35交换由于左节点没有字节点所以不用在维护。
接着是23比左节点78小,23和78交得到
交换后23比左节点小继续维护得到
交换后26比右节点小,交换得
然后45比78小,45和78交换
交换后45比67小,45和67交换
此时大顶堆完成,交换第一个和最后一个,断开最后一个(数组减一)。
重复以上过程可以完成数组升序排列。
4)实现代码及示例
功能函数:
void swap(int *a,int *b)//实现两个数据交换
{
int tem;
tem=*a;
*a