【Data_Structure笔记8】排序算法之【选择排序---堆排序】
来源:互联网 发布:作图软件cs 编辑:程序博客网 时间:2024/06/14 18:29
/******************************************************************************************************************文件说明: 【选择类排序】之【堆排序】堆排序说明: 【1】在堆排序中,有三个关键的步骤,分别为: 【1】重建堆 【2】建初堆 【3】堆排序【2】当堆顶元素发生改变时,如何重建堆?-----------【重建堆】 参考耿国华《数据结构》316页的图示,注意,重建堆的时候,分为两种具体的算法,重建大根堆和重建小根堆。【3】如何由一个任意序列建初堆?-------------------【建初堆】【4】如何利用堆完成排序?-------------------------【堆排序】堆排序算法基本思想: 【1】将待排序记录按照堆的定义建初堆,并输出堆顶元素;【2】将剩余的记录序列重建堆,在输出堆顶元素【3】重复步骤2*******************************************************************************************************************/#include <iostream>#include <algorithm>using namespace std;/*****************************************************************************************************************模块说明: 重建堆-------调整堆******************************************************************************************************************/template<typename ElemType>void HeapAdjust(ElemType arrayT[],int iRootNum,int iLength){ int lChild = 2*iRootNum; //【1】iRootNum的左孩子节点序号 int rChild = 2*iRootNum+1; //【2】iRootNum的右孩子节点序号 int iMax = iRootNum; //【3】临时变量,存储大根堆的根节点序号(相对来说) if(iRootNum<=iLength/2) //【4】如果iRootNum是叶节点就不用进行调整 { if(lChild<=iLength&&arrayT[lChild]>arrayT[iMax]) { iMax=lChild; } if(rChild<=iLength&&arrayT[rChild]>arrayT[iMax]) { iMax=rChild; } if(iMax!=iRootNum) {std::swap(arrayT[iRootNum],arrayT[iMax]); HeapAdjust<int>(arrayT,iMax,iLength); //【5】避免调整之后以max为父节点的子树不是堆 } } }/*****************************************************************************************************************模块说明: 建初堆******************************************************************************************************************/template<typename ElemType>void BuildHeap(ElemType arrayT[],int iLength) //【0】建初堆 { for(int iNonLeafRootNum=iLength/2;iNonLeafRootNum>=1;iNonLeafRootNum--) //【1】非叶节点最大序号值为iLength/2 { HeapAdjust<int>(arrayT,iNonLeafRootNum,iLength); //【2】调整堆 } } /*****************************************************************************************************************模块说明: 堆排序******************************************************************************************************************/template<typename ElemType>void HeapSort(ElemType arrayT[],int iLength) { BuildHeap<int>(arrayT,iLength); //【1】建初堆 for(int i=iLength;i>=1;i--) { std::swap(arrayT[1],arrayT[i]); //【2】交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 HeapAdjust<int>(arrayT,1,i-1); //【3】重新调整堆顶节点成为大顶堆 }} /*****************************************************************************************************************模块说明: 控制台应用程序的入口点******************************************************************************************************************/int main(int argc, char *argv[]){ int arrayT[20]={0,10,9,8,7,1,2,3,4,5,6,100,90,80,70,60,50,40,30,20};//【1】数组的第一个元素不参与排序 int iLength = 19; //【2】实际参与排序元素的个数 HeapSort(arrayT,iLength); for(int i=1;i<20;i++){std::cout<<arrayT[i]<<std::endl;}std::system("pause"); return 0;}
阅读全文
0 0
- 【Data_Structure笔记8】排序算法之【选择排序---堆排序】
- 【Data_Structure笔记5】排序算法之【选择类排序】
- 【Data_Structure笔记4】排序算法之【交换类排序】
- 【Data_Structure笔记6】排序算法之【二路归并排序】
- 排序算法-选择排序之堆排序
- 【Data_Structure笔记7】排序算法之【链式基数排序】
- 【Data_Structure笔记14】【笔试】之【所有排序算法】
- 【Data_Structure笔记3】排序算法之插入排序常见的三种算法
- 排序算法七:选择排序之堆排序
- 排序算法七:选择排序之堆排序
- 数据结构:排序算法之堆排序和选择排序
- 算法---选择-堆排序
- 算法笔记之堆排序
- 算法笔记之堆排序
- 选择排序之堆排序
- 选择排序之----堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 海康SDK java调用中遇到的问题
- 机器学习之路,你可能需要用到的...
- MySQL常用的四种引擎的介绍
- 数据结构 树 哈夫曼树及编码 C语言版
- 今日头条实习面试总结(1)
- 【Data_Structure笔记8】排序算法之【选择排序---堆排序】
- UE4学习笔记21th:创建菜单控件蓝图
- 关于VMware下安装VMware tools,安装文件没有出现问题的解决
- 数据结构 图 Dijkstra算法
- 备份/etc文件的周期性任务的详细介绍
- source insight使用教程
- HDU3938 Portal
- django自定义非主键自增字段类型(auto increment field)
- UPC 1053 Mysterious Treasure (记忆化搜索)