基于visual Studio2013解决面试题之0209最大堆排序
题目
解决代码及点评
/*最大堆是一个数组数据结构,任意一个下标i,它的值大于i*2和i*2+1的值(i从1开始)当这样的堆形成时,最大值在数组最开始的位置。当这样的堆形成后,将第一个元素交换到最后,并在剩余的数据中再调整堆,形成新的堆如此反复完成排序
*/#include <iostream>using namespace std;void swap(int *a, int *b)
{int temp;temp = *a;*a = *b;*b = temp;
}/*堆调整函数,i表示需要调整的下标size表示堆长度最大堆的要求是i的值大于i*2的值和i*2+1的值
*/
void heap_adjust(int *a, int i, int size)
{int lchild = 2 * i;int rchild = 2 * i + 1;int max = i;if (i <= size / 2) //大于size/2的为叶子节点,不需要调整{if (lchild <= size && a[lchild] > a[max])max = lchild;if (rchild <= size && a[rchild] > a[max])max = rchild;if (max != i){swap(&a[i], &a[max]);heap_adjust(a, max, size); //依此调整下面的子树,为了防止交换之后不满足堆的性质}}
}/*创建堆就是调整堆的过程
*/
void create_heap(int *a, int size)
{int i = 0;for (i = size / 2; i >= 1; i--)heap_adjust(a, i, size);
}/*堆排序a存放数组size表示长度,注意,数据是从下标[1, size]
*/
void heap_sort(int *a, int size)
{int i = 0;int temp = 0;// 创建最大堆create_heap(a, size);for (i = size; i >= 1; i--){// 把第一个值,交换到最后去,最大堆里,第一个值是最大的// 把它交换到最后的位置,相当于已经有一个数据排序好了swap(&a[i], &a[1]);// 交换之后堆就被破坏了// 那么需要对除了最后一个元素外的其他元素进行堆调整// 形成新的最大堆,如此循环完成排序heap_adjust(a, 1, i - 1);}
}int main(int argc, char **argv)
{int a[100];int size = 0;cout << "堆个数:";// 输入堆中数值个数while (scanf_s("%d", &size) == 1 && size > 0){int i = 0;// 从键盘输入数值,并保存在数组for (i = 1; i <= size; i++)scanf_s("%d", &a[i]);// 在数组上进行堆排序,注意下标是从1开始到size,下标为0的值没有用// 主要是为了方便计算heap_sort(a, size);// 打印排序结果for (i = 1; i <= size; i++)printf("%d ", a[i]);}return 0;
}
代码下载及其运行
代码下载地址:http://download.csdn.net/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果
转载于:https://www.cnblogs.com/niulanshan/p/6175170.html
基于visual Studio2013解决面试题之0209最大堆排序相关推荐
- 基于visual Studio2013解决面试题之0901奇偶站队
题目 解决代码及点评 /*给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数 解决方法:两边同时遍历,如果遇到左边偶数或者右边基数,则交换 */#include <ios ...
- 基于visual Studio2013解决面试题之0403串联字符串
题目 解决代码及点评 /*有 n个长为 m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环 ...
- 基于visual Studio2013解决面试题之0804复杂链表
题目 解决代码及点评 /*复杂链表的拷贝,现在有一个复杂链表,完成一个clone函数拷贝一个链表复杂链表是指struct Node{struct Node* _next;struct Node ...
- 基于visual Studio2013解决面试题之1002公共子串
题目 解决代码及点评 /*求两个字符串的最小公共子串这道题简单的两个字符串遍历即可 */#include <iostream> using namespace std; const ...
- 基于visual Studio2013解决面试题之1007鸡蛋和篮子
题目 解决代码及点评 /*n个鸡蛋放m个篮子,篮子不能为空,有多少种方法 */#include <iostream> using namespace std; const int ...
- 基于visual Studio2013解决面试题之0601二叉树深度
题目 解决代码及点评 /*求二叉树深度 */#include <iostream> #include <stack> using namespace std;templ ...
- 基于visual Studio2013解决面试题之0402合并升序链表并去重
题目 解决代码及点评 /*两个升序链表合并,并要求去掉重复元素 */ #include <iostream> using namespace std;class LinkNode ...
- 基于visual Studio2013解决面试题之0802数字最多元素
题目 解决代码及点评 /*查找数组中超过一半的那个元素方法1:每次删除数组中一对不相同的value,最后剩下都是想通的数字时,就是超过一半的那个元素了方法2:排序后,取中间元素即可 */#in ...
- 基于visual Studio2013解决面试题之0807strstr函数
题目 解决代码及点评 /*写strstr函数简单的遍历去查找吧 */#include <iostream> #include <stdio.h>const char * ...
最新文章
- 模板引擎:VelocityFreeMarker(转)
- 十二张图详解Redis的数据结构和对象系统
- SQL中varchar和nvarchar有什么区别?
- nginx的反向代理以及负载均衡模块的使用
- 轻松学习JavaScript十七:JavaScript的BOM学习(二)
- java生成密码_java生成密码生成 | 学步园
- 键盘显示影响布局的解决方法
- java ioc_Java体验IOC
- 连续获两家乘用车前向定点, 又一家国产毫米波雷达企业欲“赶超”外资巨头
- java进销存--商品管理
- F - 悼念512汶川大地震遇难同胞
- IIR滤波器设计之冲激响应不变法与双线性变换法
- 那些年我们一起手写过的单例
- 关于php内部编码与mysql字符差异问题的研究
- Exchange报错:452 4.3.1 Insufficient system resources
- 不懂DVC6200调试请看这里
- hive修改字段及字段类型
- 神经内分泌肿瘤治疗新进展,神经内分泌肿瘤进展
- 高端优雅简历模板打包下载(附找工作指南)
- 4 前端 溢出 定位 模态框 透明度 JavaScript简介
热门文章
- 网众无盘服务器 快车挂盘失败 显示 当前磁盘已经为超级工作站模式,网众无盘超级工作站的一些经验总结...
- python字典程序题_python字典练习题
- linux下安装libsvm_Linux下libsvm的安装及简单练习
- go操作网页元素_UI自动化21heliumS元素定位方式
- php百分比乘加,用php简单实现加减乘除计算器
- python中国余数定理_Python实现的中国剩余定理算法示例
- git 在拉取代码的时候connect 谷歌报错_工具 | 手把手教你在VSCode中使用Git
- 杭州中国移动java待遇_【中国移动杭州研发中心Java面试】移动杭研社招java中级面试-看准网...
- c++ gets()、scanf() 、getline()、cin读取字符、字符串
- java 执行cmd 堵塞_java中调用cmd命令被阻塞无法返回和继续执行