排序算法之六 堆排序

堆排序(Heap sort),是利用数据结构堆(Heap)来对数列进行排序的方法。

堆类似于一种完全二叉树,其元素分布在一个数组之中,不同的树节点编号对应不同的数组索引号。

比如:数组10 6 3 7 2 8 9 2 4 1 对应的堆形状类似于:

总结起来,就是父节点 i 的左子节点在位置 (2*i);父节点 i 的右子节点在位置 (2*i+1);子节点 i 的父节点在位置 floor(i/2);C/C++中,父节点 i 的左子节点在位置 (2*i+1);父节点 i 的右子节点在位置 (2*i+2);子节点 i 的父节点在位置 floor((i-1)/2)。

但上图并不是一个堆,因为对要满足父节点的值要始终不大于子节点(小根堆)或者始终不小于子节点(大根堆)。

因此要得到上图对应的堆(大根堆),需要对所有的父节点(满足 i*2 +1 < last 的节点 i)进行堆化(heapify)操作,使得最后的结果满足堆的要求。

最后得到的堆如下图:

对应的数组结构为: 10  7  9  6  2  8  3  2  4  1

得到对结构以后,就可以进行堆排序了。

因为堆的根节点始终是未排序区的最大元素,所以可以循环地将堆顶元素与最后的未排序元素交换。每一次将最后面的元素(最后一个叶节点)与根节点交换,得到了一个近似堆和后面一个有序部分。对除有序部分之外的近似堆进行堆化处理又生成了一个新堆,从而又可以进行新的过程了。

算法如下:

首先,堆原始数组进行建堆操作。

然后,i = 1,i < n-1,

然后,将 d[0] 与 d[n-i] 交换,对前(n-i)个元素组成的近似堆进行堆化操作

然后,i++

然后重复上两步,一直到数组有序。

实现代码如下:

void heapify(double *dataIn, int index, int sizeIn)
{/* 2012/08/24, by wbprime@myopera.com */
    
    int lChild = index * 2 + 1,
        rChild = index * 2 + 2;
    int iParent = index;
    
    if(lChild < sizeIn && dataIn[lChild] > dataIn[iParent]) {
        iParent = lChild; 
    }
        
    if(rChild < sizeIn && dataIn[rChild] > dataIn[iParent]) {
        iParent = rChild; 
    }
    
    if (iParent != index) {
        swap(dataIn[iParent], dataIn[index]);
        heapify(dataIn, iParent, sizeIn);
    }
    
}

void buildHeap(double *dataIn, int sizeIn)
{/* 2012/08/24, by wbprime@myopera.com */

    for (int i = (sizeIn-2)/2; i >= 0; i--) {
        heapify(dataIn, i, sizeIn);
    }

}

void heapSort(double *dataIn, int sizeIn)
{/* 2012/08/24, by wbprime@myopera.com */

    /* first build a heap */
    buildHeap(dataIn, sizeIn);
    /* then exchange the last unsorted element with the root of heap */
    for (int i = sizeIn - 1; i > 0; i--) {
        swap(dataIn[0], dataIn[i]);
        heapify(dataIn, 0, i);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值