堆排序
来源:互联网 发布:snmp端口161与162用途 编辑:程序博客网 时间:2024/06/13 15:30
堆排序是利用对的性质进行排序的一种排序方法。
1.什么是堆:
堆可以看做是一个完全二叉树的储存结构,且非叶子节点不小于(或不大于)其孩子节点。若父节点不小于子节点(ki>=k(2i+1)并且ki>=k(2i+2))称为大根堆,即根节点的关键字值最大。反之,父节点不大于子节点(ki<=k(2i+1)并且ki<=k(2i+2))称为小根堆,根节点的关键字值最小。
由于根节点(堆顶)始终是堆里面的最大值或者是最小值,因此可以利用这个性质进行排序。
2.堆的排序思想(基于大根堆)
① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
3.代码实现。(C代码,来自百度百科)
#include <stdio.h>//array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度//本函数功能是:根据数组array构建大根堆void HeapAdjust(int array[],int i,int nLength){ int nChild; int nTemp; for(;2*i+1<nLength;i=nChild) { //子结点的位置=2*(父结点位置)+1 nChild=2*i+1; //得到子结点中较大的结点 if(nChild<nLength-1&&array[nChild+1]>array[nChild]) { ++nChild; } //如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点 if(array[i]<array[nChild]) { nTemp=array[i]; array[i]=array[nChild]; array[nChild]=nTemp; } else break; //否则退出循环 }}//堆排序算法void HeapSort(int array[],int length){ int i; //调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素 //length/2-1是最后一个非叶节点,此处"/"为整除 for(i=length/2-1;i>=0;--i)//初始化堆 { HeapAdjust(array,i,length); } //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素 for(i=length-1;i>0;--i) { //把第一个元素和当前的最后一个元素交换, //保证当前的最后一个位置的元素都是在现在的这个序列之中最大的 array[i]=array[0]^array[i];//实现两个数的交换。 array[0]=array[0]^array[i]; array[i]=array[0]^array[i]; //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值 HeapAdjust(array,0,i); }}int main(){ int i; int num[]={9,8,7,6,5,4,3,2,1,0}; HeapSort(num,sizeof(num)/sizeof(int)); for(i=0;i<sizeof(num)/sizeof(int);i++) { printf("%d ",num[i]); } printf("\nok\n"); return 0;}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- simple-framework(MaliSDK框架分析)
- mysqldump: Got error: 2003: Can't connect to MySQL server on '127.0.0.1' (10061)
- Scroller类的使用(用来在ViewGroup里面让子view经常优美 的滑动)
- Vijos P1198最佳课题选择
- Longest Words
- 堆排序
- java 内部类简单分析
- jquery三级联动
- SQLite并发访问及实现
- 【xml】XML技术
- google_cpp编程规范要点整理
- 银行储蓄系统完整版
- Volatile
- 数字的空洞