数据结构之堆排序
2013-11-01 08:14
190 查看
#include <iostream> using namespacestd; /* 将根节点root筛选成最大结点,注意root的【左右孩子】(root不用满足,不然就不用sift了)必须满足堆的性质了(即父节点必须大于左右孩子),最初拿到数据时,我们 是从倒数第一个有孩子的结点(n/2)开始的,而他的孩子是叶子,叶子满足堆的性质。 */ void sift(int src[],introot,intn) { // 父结点,左右孩子的索引 int parent =root; int lchild =parent*2; int rchild =parent*2+1; // 保存最大孩子的数据 int max_child; // 保存最大孩子的索引,每次父节点跟左右孩子交换的时候,有可能会破坏子树的堆性质 // 当然只破坏左右子树中和父结点交换的那一棵而已 int max_child_index; // 保存根结点的数据,每次父结点小于孩子结点的时候不需要跟孩子交换数据 // 只需要将孩子的数据复制到父结点就行了 int root_data =src[root];
// 如果存在左孩子 while(lchild <=n) { // 存在有孩子 if(rchild <=n) { //左孩子大于右孩子 if(src[lchild]>src[rchild]) { max_child = src[lchild]; max_child_index =lchild; } //右孩子大于左孩子 else { max_child = src[rchild]; max_child_index =rchild; } //左右孩子中最大的孩子大于父节点 if(max_child >root_data) { src[parent] =max_child; parent = max_child_index; } else { break; } } else { if(src[lchild]>root_data) { src[parent] =lchild; parent = lchild; } else { break; } } lchild= parent*2; rchild= parent*2+1; } src[parent] =root_data; } void build(int src[],intn) { // 一棵有n个结点的树,n/2之后的所有都是叶结点 for(introot =n/2;root >=0; --root) { sift(src,root,n); } } void heapSort(int src[],intn) { // 将树初始化为堆 build(src,n); for(inti =n;i >= 0;--i) { // 输出根结点 cout<<src[0]<<""; // 将最后一个放到根结点,顺便把树的结点数目减一 src[0]= src[n--]; // 再将根结点的堆性质被破坏的数重新筛选成堆 sift(src, 0,n); } cout<<endl; } int main() { int src[10] = {4,5,6,7,8,9,1,2,3,0}; int n = 9; //int src[6] = {2,5,4,3,1,6}; //int n= 5; heapSort(src,n); return0; }
相关文章推荐
- [算法与数据结构] - No.6 堆排序
- C语言基本数据结构之五(折半插入,堆排序,冒泡排序,快速排序,并归排序)
- 【数据结构&&算法】堆排序
- 【数据结构】排序番外篇 堆,堆排序与其前身选择排序
- 算法与数据结构之堆排序
- 数据结构笔记————堆排序
- 数据结构 — 浅析堆排序
- java数据结构之插入排序(选择排序(直接选择排序、堆排序))
- Python天天美味(32) - python数据结构与算法之堆排序
- C++代码,数据结构-内部排序-选择排序-堆排序
- 数据结构-中序遍历线索二叉树,堆排序
- 数据结构-堆排序
- 数据结构排序-堆排序
- [数据结构]堆排序的C语言简单实现
- 数据结构排序问题---堆排序及各种排序时间空间复杂度
- 数据结构与算是:C++实现堆排序
- 【数据结构】排序算法:希尔、归并、快速、堆排序
- 浅谈算法和数据结构: 五 优先级队列与堆排序
- 【数据结构】堆排序
- 数据结构示例——堆排序过程