我理解的最大堆排序
来源:互联网 发布:金盾网络机柜 编辑:程序博客网 时间:2024/05/18 01:09
最近在研究排序算法,自己写了个函数模板。
最大堆排序根本的思路是将数组看作为二叉树,构建最大堆,最大数据在构建过程中移动到第一个位置,然后交换到最后一个位置,在调整最大堆,需要调整的数据不断递减,最后达到整个数组有序。
template<class T>void HeapAdjust(T*pArr,int index, int nLength){//假设整个数组是以第一个元素为根节点的二叉树,要构成最大堆,调整index位置元素的最终位置if(!pArr)return;T temp =pArr[index];//从左子节点开始查找,下标从0开始,左孩子一定是2*index+1,右孩子一定是2*index+2;//步长i=2*i+1,从下一层继续for (int i=2*index+1;i<nLength;i=2*i+1){//index节点是父节点,在父节点的子节点中比较找出较大的元素移到父节点,//看看左右节点哪个大,用大的与父节点比较if (i<nLength &&pArr[i] < pArr[i+1])++i;//父节点已经是最大的直接跳出循环,//注意,循环是从最后一层节点级叶子节点开始的,//所以父子节点值得大小判断只需要邻层比较,不用考虑跨层if(!(temp<pArr[i]))break;//调整位置pArr[index] = pArr[i];//较小值位置index =i;}//把原父节点的值转移到新的位置pArr[index] = temp;}template<class T>void HeapSort(T* pArr,int nLength){if(!pArr)return;int i;//初始化最大堆for (i=nLength/2;i>=0;i--){//调整节点从叶子节点的上一层开始,因为默认为是二叉树,所以选取节点从中间开始//调整目的是每次调整本节点是所有子节点中最大的。//当==0时,调整出最大元素在0位置。最大堆也构建完毕HeapAdjust(pArr,i,nLength);}for (i= nLength-1;i>0;i--){//将最大值往后放T temp = pArr[0];pArr[0]=pArr[i];pArr[i]=temp;//调整最大堆//移除了最大元素,0位置的元素又需要调整了,0元素以下的子树已经是最大堆,//只需要调整0位置,数组长度减一,因为最后一个已经是最大值了。//每次调整都是针对0位置的操作,选出最大值往后放,最后全部有序。HeapAdjust(pArr,0,i-1);}}
1 0
- 我理解的最大堆排序
- 堆排序的理解
- 堆排序的理解
- 最大堆及堆排序的实现
- 最大堆的建立和堆排序
- 最大堆及堆排序的实现
- 伪最大堆顶堆排序--没有真正理解最大堆
- 堆排序(最大堆)
- 堆排序(最大堆)
- 最大堆 堆排序
- 我---对‘数据结构’中‘排序’的理解 ---------3:选择排序--(二)堆排序
- 最大二叉堆的建立以及最大堆排序
- 堆排序【自己的理解】
- 对堆排序的理解
- 关于堆排序的理解
- 堆排序以及归并排序的理解
- Java-最大堆的排序,插入,删除
- 最大堆和堆排序
- 常用设备接口类GUID
- 每天一命令(7)mv(move (rename) files)
- 图像识别中距离变换的原理及作用详解,并附用OpenCV中的distanceTransform实现距离变换的代码!
- 树回归预测结果可视化
- 一些英文词的标准缩写
- 我理解的最大堆排序
- JavaScript 原型与实例
- Mybatis学习之集成spring3(5)
- DFS解决n皇后问题
- sublime安装使用
- iOS开发之日志框架CocoaLumberjack的配置与使用详解
- NET(C#):使用HttpWebRequest头中的Range下载文件片段
- kylin mondrian saiku interaction
- C语言的特点