排序七之堆排序
来源:互联网 发布:端口号大全 编辑:程序博客网 时间:2024/05/18 01:57
Heap Sort
一种基于选择排序思想,利用堆结构和二叉树的一些性质来完成数据排序的排序算法。
堆排序的关键是构造堆结构,准确而言,堆结构即是一个完全二叉树,树中的每一个节点对应原始数据的一个记录。每个节点应满足以下条件:
1)从小到大排序:要求非叶结点的数据要大于或等于其左、右子节点的数据。
2)从大到小排序:要求非叶节点的数据要小于或等于其左、右子节点的数据。
一个完整的堆排序需要反复经过两个步骤:构造堆结构和堆排序的输出。
构造堆结构过程:
对于一个非叶结点Ai,这里假定Ai的左子树与右子树已经进行了筛运算,即已构成堆结构;
1:比较Ai的左子树与右子树的最大值,将最大值放在Aj中。
2:将Ai的数据与Aj的数据进行比较,如果Ai大于Aj表示以Ai为根的子树已构成堆结构,便可以终止运算。
3:如果Ai小于Aj,则将Ai与Aj互换位置。
4:经过第三步后,可能会破坏以Ai为根的堆,因为此时Ai的值为原来的Aj。下面以Aj为根重复前面的步骤,直到满足堆结构的定义,即父节点大于子节点。这样一Aj为根的子树就被调整为一个堆结构。
堆排序的输出过程:
1:将堆结构的根节点放到数组的最后。
2:除最后一个节点外的其他节点重新执行前面的构造堆过程。
#include<stdio.h>#include<stdlib.h>#include<time.h>#define SIZE 10void HeapSort(int *a,int n){ int i,j,h,k; int t; for(i=n/2-1;i>=0;i--) { while(2*i+1<n) { j=2*i+1; if((j+1)<n) { if(a[j]<a[j+1]) j++; } if(a[i]<a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; i=j; } else{break;} } } for(i=n-1;i>0;i--) { t=a[0]; a[0]=a[i]; a[i]=t; k=0; while(2*k+1<i) { j=2*k+1; if((j+1)<i) { if(a[j]<a[j+1]) j++; } if(a[k]<a[j]) { t=a[k]; a[k]=a[j]; a[j]=t; k=j; } else{break;} } }}int main(){ int i; int shuzu[SIZE]; srand(time(NULL)); for(i=0;i<SIZE;i++) shuzu[i]=rand()/1000+100; printf("排序后的数组为:\n"); for(i=0;i<SIZE;i++) printf("%d ",shuzu[i]); printf("\n"); HeapSort(shuzu,SIZE); printf("排序后的数组为:\n"); for(i=0;i<SIZE;i++) printf("%d ",shuzu[i]); printf("\n"); return 0;}
1 0
- 排序七之堆排序
- 八大排序学习之七堆排序
- 排序算法七:选择排序之堆排序
- 排序算法七:选择排序之堆排序
- 数据结构之二叉堆(构建堆,堆排序)-(七)
- 排序算法(七)-堆排序
- 堆排序(七)
- 七、堆排序
- 基于JAVA的排序算法之七--堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- eclipse 使用 git@osc
- MAMP配置多虚拟主机
- java邮件解析2
- 看图识“字”(6)-关键词频率越高面积越大
- utf-8的问题
- 排序七之堆排序
- esp32编译工具链安装
- java邮件解析3
- Light OJ 1047 Neighbor House(简单DP)
- 看图识“字”(7)-突出的最大值/最小值
- 解决server 2012下 wamp 启动80端口被占用问题
- 正则表达式在性能测试中的应用
- 20分钟轻松制作移动网站
- UIActionSheet :libc++abi.dylib: terminate_handler unexpectedly threw an exception