堆排序

      1964年,J.willioms和Robert W.Floyd提出了一种改进的树形选择排序——堆排序。只需要一个记录大小的辅助空间,每个待排序记录仅占一个单元的存储空间。

      动态内存分配里面也有堆的概念,但是彼堆非此堆,我刚开始果断把它们混淆了,经过几番对比,才在经验里把它们区分开来——噢,排序里用的堆是酱紫的:用一棵完全二叉树来形容的话,是说任意非终端结点的关键字不小于(大根堆)或不大于(小根堆)它的孩子结点。

      利用堆结构的这个特性,我们看到,以大根堆为例的话,堆顶元素一定是所有元素(记录)里面关键字最大的元素。如果以一维数组a[n]来体现堆结构并排序,那么,a[i]如果有左孩子,那就是a[2i + 1],如果有右孩子,那就是a[2i + 2],而如果有父结点,那就是a[(i – 1) / 2]。排序的时候,我们首先对无序的数组作调整使其满足堆的特性,再将堆顶元素与最后一个元素(最后一个叶子结点)值交换。

      交换堆顶元素和最后一个元素以后,原有的堆结构就有可能被破坏了,但是因为根结点的左子树和右子树仍然是堆,所以我们只需要自顶向下,走一条单一的,最长为树的深度的路径就可以把乱序树重新调整为堆;在这之后又交换堆顶元素和倒数第2个元素,进入一个迭代的过程,直至整个数组有序(不降序)。

      以下就是我写的一个堆排序的C语言实现:
void heap_sort(const int n,int *a)    /*n为待排序元素个数,a为待排序数组*/
{
        int m = n - 1;

        /*建初始堆*/
        int i = n - 1;
        while ((i - 1) / 2 >= 0)
        {
                if (a[i] > a[(i - 1) / 2])
                {
                        int temp = a[(i - 1) / 2];
                        a[(i - 1) / 2] = a[i];
                        a[i] = temp;
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值