选择排序之堆排序
来源:互联网 发布:南望王师又一年 知乎 编辑:程序博客网 时间:2024/06/06 03:45
堆排序(HeapSort)是利用堆积树这种数据结构所设计的一种排序算法,他是选择排序的一种,其存储结构类似于完全二叉树:
二叉堆满足的性质:
1父节点的值总是大于或者等于(小于或者等于)孩子节点的值的
2.每个节点的·左右子树都是一个二叉堆。
当父节点的值大于或者等于任意一个子结点的值时,则成为大根堆;当父节点总是小于或者等于任意一个叶子节点的值时则被称为小根堆。如下图所示:
左边为小根堆,右边为大根堆。
对的存数结构一般采用数组,如下图所示。节点下标和在数组里面的值一一对应。
typedef struct{ KeyType key;} RedType;typedef struct{ RedType r[SIZE + 1]; int length;} SqList;
堆的创建:
例如:对上图的大根堆进行排
将49与08交换,然后对余下的几个数据(不包括49)重新构建大根堆然后将堆顶元素与倒数第二个元素交换,重新构建大根堆。然后重复上述操作,直到堆顶为最小元素。这样利用大根堆进行升序排序就完成
下面是大根堆的实现代码
void HeapAdjust(HeapType & H, int s, int m){ RedType rc; rc=H.r[s]; for(int j=2*s;j<=m;j++) { if(j<m&&H.r[j].key<H.r[j+1].key) j++; if(rc.key>H.r[j].key) break; H.r[s]=H.r[j]; s=j; } H.r[s]=rc;}调整堆,将其排列成大根堆,一次操作只能保证堆顶元素为最大元素。将堆顶元素与当前最大的元素交换。然后在后面的操作中去掉这个元素
void HeapSort(HeapType & H){ int temp; for(int i=H.length/2;i>0;i--) HeapAdjust(H,i,H.length);for(int j=H.length;j>1;j--){temp=H.r[1].key;H.r[1].key=H.r[j].key;H.r[j].key=temp;HeapAdjust(H,1,j-1);}}
20 0
- 选择排序之堆排序
- 选择排序之----堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之--堆排序
- 选择排序之堆排序
- 八大排序 --选择排序 之 【堆排序】
- 排序算法-选择排序之堆排序
- 内部排序之选择排序:简单选择排序,堆排序
- 排序之选择排序、堆排序、归并排序、快速排序
- 选择排序之堆排序Java实现
- 7.4.2 选择排序之堆排序
- 2 -- 选择排序之堆排序
- $(function(){})与(function($){})(jQuery)
- zookeeper 分布式锁服务
- 关于运动
- hdu2647 Reward
- [LeedCode OJ]#234 Palindrome Linked List
- 选择排序之堆排序
- 十道海量数据处理题
- UVA 816 有点绕的迷宫
- 【经典算法】STL之next_permutation和prev_permutation
- 算法系列-合并有序数组
- 数组中只出现一次的数字
- Nginx基础. 开发HTTP过滤模块
- cannot do a partial commit during a merge
- IOS_UITableViewController 视图控制器的生命周期