C++ 实现堆排序
2015-08-18 21:49
453 查看
堆定义:由n个元素组成的序列{k1,k2,...,kn-1,kn},当且仅当满足如下图关系时,称之为堆
![](http://img.blog.csdn.net/20150816194413346?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
若将和此序列对应的一维数组看成一个完全二叉树,树中每个结点对应于原始数据的一个记录,并且每个结点应满足以下条件:非叶结点的数据大于或等于其左、右孩子结点的数据(若是按从大到小的顺序排序,则要求非叶结点的数据小于或等于其左、右孩子结点的数据)。
由堆的定义可看出,其根结点为最大值,堆排序就是利用这一特点进行的。堆排序过程包括两个阶段:
(1)将无序的数据构成堆(即用无序数据生成满足堆定义的完全二叉树)。
从一个无序的序列建堆的过程是一个反复筛选的过程。若将此序列看成一个完全二叉树,则最后一个非终端节点是[n/2]个元素,由此筛选。不满足条件则交换(按建小顶堆)(每一个非叶子节点数据小于等于其左右子树),然后再到[n/2]-1,以此类推到第一个元素。
(2)利用堆排序(即用上一步生成的堆输出有序的数据)。
若将和此序列对应的一维数组看成一个完全二叉树,树中每个结点对应于原始数据的一个记录,并且每个结点应满足以下条件:非叶结点的数据大于或等于其左、右孩子结点的数据(若是按从大到小的顺序排序,则要求非叶结点的数据小于或等于其左、右孩子结点的数据)。
由堆的定义可看出,其根结点为最大值,堆排序就是利用这一特点进行的。堆排序过程包括两个阶段:
(1)将无序的数据构成堆(即用无序数据生成满足堆定义的完全二叉树)。
从一个无序的序列建堆的过程是一个反复筛选的过程。若将此序列看成一个完全二叉树,则最后一个非终端节点是[n/2]个元素,由此筛选。不满足条件则交换(按建小顶堆)(每一个非叶子节点数据小于等于其左右子树),然后再到[n/2]-1,以此类推到第一个元素。
(2)利用堆排序(即用上一步生成的堆输出有序的数据)。
#include<iostream> using namespace std; template<class ItemType> class HeapSort { private: ItemType *data; int length; public: HeapSort() { this->data=nullptr; this->length=0; } void HeapAdjust(int s,int length)//s 表示要筛选的节点 { int i,j; for(i=2*s;i<=length;i*=2) { if(i+1<=length&&data[i]>data[i+1])i++; //选择一个最小的 if(data[s]<=data[i]) break; //比最小的还小结束 ItemType temp=data[i]; data[i]=data[s]; data[s]=temp; s=i;//有了调整,可能会影响其它节点 } } void sort(ItemType *data,int length) { this->data=data; this->length=length; for(int index=length/2;index>=1;index--) this->HeapAdjust(index,length);//见堆的过程 for(int index=length;index>1;index--) { ItemType temp=data[1];//每次筛选出来的元素放到最后 data[1]=data[index]; data[index]=temp; this->HeapAdjust(1,index-1); } } }; int main() { int data[9]={0,49,38,65,97,76,13,27,49};//下标是从1开始 HeapSort<int> heap; heap.sort(data,8);//8个元素下标是从1 开始 for(int i=1;i<=8;i++) cout<<data[i]<<endl; cin.get(); return 0; }
相关文章推荐
- C语言正则表达式的匹配问题
- C语言例程20150817-001(平台Visual Studio 2012)
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- C语言之文件操作08——总结
- C++ delete错误
- python C语言文件IO读取树莓派CPU、GPU温度
- 学习算法-基数排序(radix sort)卡片分类(card sort) C++数组实现
- 常对象只能调用常函数成员 c++
- C语言之文件操作07——读取文件数据并计算均值方差标准差
- 回溯算法之Anagrams by Stack
- C++名字查找
- C++ 容器(一):顺序容器简介
- C++ 容器(一):顺序容器简介
- 鸡啄米:C++编程入门系列之三十九(继承与派生:派生类的构造函数)
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- C++中数据类型的字节数
- 转:理解C++11的模板类型推导
- 指针和引用区别(More Effective_C++_1(基础))
- C++ Primer 5e chapter 1
- c++ 之typedef