堆排序
2016-01-10 16:49
281 查看
Description
堆排序有以下两个操作(以最大堆为例):
1、 建立最大堆
2、 移动第一个元素,调整最大堆
本题要求你写一个堆排序。
Input
每一行是一个测试用例,包含n+1个整数。
第一个整数n代表该行有n个整数需要进行堆排序,后面的n个整数即需要排序的对象。
输入以EOF结束。
Output
对于每一个测试用例,输出它每个操作之后这n个整数的顺序,也就是建立最大堆之后输出整个数组的元素,后面每次移动元素调整堆也都要输出整个数组的元素。
每两个元素之间用空格隔开,最后一个元素之后没有空格,每次操作的输出占一行(所以每个测试用例会有n行输出)。
以对序列【2 1】进行堆排序为例:
建立最大堆得到:【2 1】
把第一个元素移到末尾,调整最大堆(此时最大堆只有一个元素,就是1)得到:【1 2】
结束
Sample Input
Copy sample input to clipboard
Sample Output
code:
堆排序有以下两个操作(以最大堆为例):
1、 建立最大堆
2、 移动第一个元素,调整最大堆
本题要求你写一个堆排序。
Input
每一行是一个测试用例,包含n+1个整数。
第一个整数n代表该行有n个整数需要进行堆排序,后面的n个整数即需要排序的对象。
输入以EOF结束。
Output
对于每一个测试用例,输出它每个操作之后这n个整数的顺序,也就是建立最大堆之后输出整个数组的元素,后面每次移动元素调整堆也都要输出整个数组的元素。
每两个元素之间用空格隔开,最后一个元素之后没有空格,每次操作的输出占一行(所以每个测试用例会有n行输出)。
以对序列【2 1】进行堆排序为例:
建立最大堆得到:【2 1】
把第一个元素移到末尾,调整最大堆(此时最大堆只有一个元素,就是1)得到:【1 2】
结束
Sample Input
Copy sample input to clipboard
2 2 1
Sample Output
2 11 2
code:
#include <iostream> using namespace std; int str[1005]; //把str[index]调整到正确的位置,堆中元素个数为n void adjustHeap(int index, int n) { int max_ = str[index];//str[index]和其左右孩子中最大的值 int max_index = index; if (2 * index <= n && str[2 * index] > max_) { max_ = str[2 * index]; max_index = 2 * index; } if (2 * index + 1 <= n && str[2 * index + 1] > max_) { max_ = str[2 * index + 1]; max_index = 2 * index + 1; } //把str[index]和其左右孩子中最大的值放在树根 if (index != max_index) { swap(str[index], str[max_index]); adjustHeap(max_index, n); } } //建立n个结点的堆 void buildHeap(int n) { for (int i = n / 2; i >= 1; i--) {//对有孩子的结点调整 adjustHeap(i, n); } } //打印数组中元素 void print(int n) { for (int i = 1; i < n; i++) { cout << str[i] << " "; } cout << str << endl; } int main(void) { int n; while (cin >> n) { for (int i = 1; i <= n; i++) { cin >> str[i]; } buildHeap(n); print(n); for (int i = n; i > 1; i--) { swap(str[1], str[i]);//str[1]中存着无序区间中最大的数 adjustHeap(1, i - 1); print(n); } } }
相关文章推荐
- Shuffle'm Up
- Shuffle'm Up
- 使用python 加载tkdnd 的库(_load_tkdnd : _tkinter.TclError: couldn't load library )的时候错误的解决措施
- Uoj#35. 后缀排序
- [java面试]宇信易诚 广州分公司 java笔试题目回顾录
- 金山词霸2016.1.3.3 手动去广告方法
- C++学习笔记(二)
- 简单的HTML5音乐播放器(带歌词滚动)
- Java与模式:装饰(Decorator)模式
- 分级基金下折套利风险介绍
- 【慕课笔记】第三章 常用的运算符 第2节 JAVA中的算术运算符
- bzoj 3156 防御准备(斜率DP)
- 在多线程程序中指定线程来处理信号
- Mac下安装MySQL5.7.10,以及字符编码问题
- 解决VMware桥接无法启用
- python入门笔记(Day5)--filter,sorted,lambda,装饰,偏,模块
- 设计模式(一)设计六大原则
- error: expected declaration or statement at end
- 2016年1月10日 写个非计算机专业的小伙伴
- 设计模式之设计六大原则