堆排序
来源:互联网 发布:看书哪个软件好 编辑:程序博客网 时间:2024/06/07 13:02
在一个一维数组中模拟二叉树,操作的堆排序。
#include <stdio.h>#include <stdlib.h>void Swap(int *num, int v, int u){ int temp = num[v]; num[v] = num[u]; num[u] = temp;}void PercolateDown(int num[],int index,int size){ int min;// 设置最小指向下标 while (index * 2 + 1<size) //判断是否有左节点 { min = index * 2 + 1; if (index * 2 + 2<size) //判断是否有右节点 min =num[min]<num[index * 2 + 2]?min:index * 2 + 2;//左右节点之间去更小 if (num[index]>num[min]) //最小节点与根节点比较 { Swap(num, index, min); index = min; } else break;// 停止下滤操作 }}void PrintHeap(const char* strMsg,int num[],int nLength)//输出当前数列{ int i; printf("%s",strMsg); for(i=0; i<nLength; i++) { printf("%d ",num[i]); } printf("\n");}void BuildHeap(int num[] ,int size){ int i; for (i = size / 2 - 1; i >= 0; i--) { PercolateDown(num, i,size);// 进行下滤操作 PrintHeap("Build heap:",num,size); }}void SortHeap(int num[] ,int size){ int i; int iLength=size; PrintHeap("Befor Sort:",num,iLength);//原数列 BuildHeap(num,size);//建立小根堆 for(i = iLength - 1; i >0; i--)//从最后一个数开始替换队首 { Swap(num, 0, i);// 交换 size--;// 每交换一次让规模减少一次 PercolateDown(num, 0,size);//将新的首元素下滤操作,因为建立了小根堆,所以操作到首位的一定是当前最小的数 PrintHeap("Sort Heap:",num,iLength); }}int main(){ int a[100000]; int n,i; printf("输入数组长度:"); scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); SortHeap(a,n); system("PAUSE"); return 0;}
阅读全文
1 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 安卓长安保存图片三种方案的对比
- Solr-6.5.1之Solrj的使用
- poj-1836-士兵出列问题-双向LIS
- Linux下PHP安装curl扩展支持https
- 【并查集】poj 1611 The Suspects
- 堆排序
- 30分钟掌握ES6/ES2015核心内容
- 快速幂算法和大整数求模
- iOS UIWindow
- Frequently Used --- 连载
- redis主从配置
- bootstrap日期控件
- iOS开发之weak和assign的区别
- NYOJ 111 分数加减法