堆排序
来源:互联网 发布:知乎空气质量检测仪 编辑:程序博客网 时间:2024/06/05 04:57
百度面试二轮游,就像CP3摸不到西决地板一样,两轮面试都问到堆排序,感觉这个排序既考查数据结构,又考察排序算法, 可是反应一个人的基础。第一面的时候还不会,用快速排序代替了,写的还可以;第二面又问到,但是之前我有看过了,可是写代码还是很费劲,最后的最后,终究被pass掉了。
回来怒写了一遍堆排序:
#include<stdio.h>int h[101];//全局变量,用数组来存储堆,从h[1]开始int n; //有n个元素 void swap(int x,int y)//交换两个索引的值{ int t; t = h[x]; h[x] = h[y]; h[y] = t; return;}void siftdown(int i)//调整堆,建立最大根堆{ int t;//临时变量,用于标记父节点,左节点,右节点中值最大的节点 int flag = 0;//临时变量用作标志,判断是否还需要继续向下比较 while(i*2 <= n && flag == 0) //有左节点且需要继续比较 { if(h[i*2] > h[i])//左节点的值大于父节点 t = i * 2; else t = i; if(2*i+1 <= n) //如果有右节点 if(h[i*2+1] > h[t]) t = i*2+1; else t = t; if(i != t)//如果父节点的值不是最大的值,需要和子节点交换 { swap(i,t);//交换两个索引的值 i = t; //在与父节点交换后的子节点位置上,继续往下比较,看是否他的子节点还有大于他的值的。 } else flag = 1;//不需要比较了,因为下边都是最大堆的顺序 } return;}void create()//建立一个最大根堆{ int i; for(i=n/2;i>=1;i--)//从最后一个非叶子节点开始向上调整 { siftdown(i); } return;}void heapsort(){ while(n>1) //最后调整到n为2 就可以了,就是2索引和1索引交换 { swap(1,n);//开始1索引处为最大值,交换到n索引处即数组末尾 n--; siftdown(1);//调整从末尾交换过来的值,再次恢复最大根堆 } return;}int main(){ int i,num; printf("Please input the number of elements:\n"); scanf("%d",&num); n = num; for(i=1;i<=n;i++) { printf("Please input %d elements:\n",i); scanf("%d",&h[i]); } create(); heapsort(); for(i=1;i<=num;i++) { printf("%d ",h[i]); } return 0;}
程序输入测试和运行结果:
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 获取 下几个月的今天
- Android UI开发推荐颜色
- 第十三周阅读程序3
- proftpd usage in AWS Ubuntu (LAMPP)
- 面试题2:实现Singleton模式
- 堆排序
- MySQL部分表复制配置下存在的运维风险、原因及一种方案
- 【转载】APP纯黑盒测试——某些可以试试的操作
- 编写代码中出现乱码的原因
- Vim的操作小技巧
- (java)美团面试之二分查找波谷值
- note:inserNode()、compareBoundaryPoint()
- 表值参数与分割字符串表值函数效率对比
- List排序