小顶堆排序的实现
来源:互联网 发布:淘宝流量高峰期查询 编辑:程序博客网 时间:2024/06/08 16:02
1、堆排序 第一步都是先建堆,在一个数组上建堆其实就是对数组的调整,使之满足小顶堆的特性。
父节点小于子节点。建立完成堆之后 就是每次把堆顶和堆的最后一个元素交换。交换之后的堆除了堆顶元素之外都满足小顶堆的要求。这时只需要对堆顶元素进行下沉,找到其合适的位置。
代码如下:
void modify(int *szArray, int i, int length){ int iNode = i; int iLeft = iNode*2 + 1; int iRight = iNode*2 + 2; if(iNode > length/2) { return; } if (iLeft < length && szArray[iLeft] <= szArray[iNode]) { iNode= iLeft; } if (iNode != i) { swap(szArray[iNode], szArray[i]); modify(szArray, iNode, length); } if (iRight < length && szArray[iRight] <= szArray[iNode]) { iNode= iRight; } if (iNode != i) { swap(szArray[iNode], szArray[i]); modify(szArray, iNode, length); }}void buildHead(int *p, int len){ int treeNode; for (treeNode = (len-1)/2; treeNode >= 0; treeNode--) { modify(p, treeNode, len); }}/* 向下调整主要用于排序*/void heap_shift_down(int *ptr,int pos, int len){ int min; //设置最小元素下标 int index = pos; while (index*2+1 < len) { min = index * 2+1; if (index*2+2 < len)// 存在右节点 { if (ptr[index*2+2] < ptr[min]) { min = index * 2 +2; } } if (ptr[index] <= ptr[min]) { break; } else { swap(ptr[pos], ptr[min]); index = min; } }}int headSort(int *p, int len){ buildHead(p, len); for(int i = len - 1;i >= 0; i--) { swap(p[0], p[i]);// 把最小的元素与后面的值交换 heap_shift_down(p,0,i-1);// 此时第一个元素不满足小顶堆 进行下沉操作 } for (int n = 0; n < len; n++) { printf("%d\n", p[n]); } return 1;}
0 0
- 小顶堆排序的实现
- 排序的实现
- 归并排序的实现
- 快速排序的实现
- 排序算法的实现
- 冒泡排序的实现
- 堆排序的实现
- 排序算法的实现
- 堆排序的实现
- 鸡尾酒排序的实现
- 桶排序的实现
- 计数排序的实现
- 归并排序的实现
- 插入排序的实现
- 希尔排序的实现
- 堆排序的实现
- 快速排序的实现
- 归并排序的实现
- Struts2的配置所需jar包
- 循序渐进实现仿QQ界面(四):圆形按钮与工具栏自绘
- Bootstrap
- 监控工程安装常见问题解决方案
- Node.js+npm安装
- 小顶堆排序的实现
- 广告营销项目知识点总结
- Android EditText 取消复制粘贴功能、取消横向全屏编辑功能
- 沈毅:万马堂领读:大品牌与小品牌
- Linux mv命令
- 按钮按下不自动弹起
- SQL Server 2014图文安装教程
- matlab 2014a 安装包及安装教程
- 支持向量机(SVM)(二)-- 拉格朗日对偶(Lagrange duality)