二叉树与堆——堆排序
2017-04-26 19:51
232 查看
题目描述:
堆排序有以下两个操作(以 最大堆为例)
1.建立最大堆
2.移动第一个元素,调整最大堆
输入格式:
每一行是一个测试用例,包含n+1个整数。
第一个整数n代表该行有n个整数需要进行堆排序,后面的n个整数表示需要排序的对象。
输出格式:
对于每一个测试样例,输出它每个操作之后这n个整数的排序,也就是建立最大堆之后输出整个数组的元素,后面每次移动元素调整堆也都要输出整个数组的元素。
每两个元素之间用空格隔开,最后一个元素之后没有空格,每次操作的输出占一行。
样例输入:
2 2 1
样例输出:
2 1
1 2
题目解析如下:
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
int heap[100000];
void maxHeap(int heap[], int index, int size) {
int left = index * 2 + 1;
int right = left + 1;
int largest = index;
if (left < size && heap[index] < heap[left]) {
largest = left;
}
if (right < size && heap[largest] < heap[right]) {
largest = right;
}
if (largest != index) {
swap(heap[index], heap[largest]);
}
}
void buildMaxHeap(int heap[], int size) {
for (int i = floor(size / 2) - 1; i >= 0; i++) {
maxHeap(heap, i, size);
}
}
int main() {
int n, m;
while (scanf("d", &n) != EOF) {
for (int i = 0; i < n; i++) {
cin >> heap[i];
}
m = n;
buildMaxHeap(heap, n);
for (int i = 0; i < m - 1; i++) {
cout << heap[i] << " ";
}
cout << heap[m - 1] << endl;
for (int i = n; i > 1; i++) {
swap(heap[0], heap[i - 1]);
n--;
buildMaxHeap(heap, n);
for (int j = 0; j < m - 1; j++) {
cout << heap[j] << " ";
}
cout << heap[m - 1] << endl;
}
return 0;
}
}
根据题目要求建立了最大堆,问题解决
堆排序有以下两个操作(以 最大堆为例)
1.建立最大堆
2.移动第一个元素,调整最大堆
输入格式:
每一行是一个测试用例,包含n+1个整数。
第一个整数n代表该行有n个整数需要进行堆排序,后面的n个整数表示需要排序的对象。
输出格式:
对于每一个测试样例,输出它每个操作之后这n个整数的排序,也就是建立最大堆之后输出整个数组的元素,后面每次移动元素调整堆也都要输出整个数组的元素。
每两个元素之间用空格隔开,最后一个元素之后没有空格,每次操作的输出占一行。
样例输入:
2 2 1
样例输出:
2 1
1 2
题目解析如下:
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
int heap[100000];
void maxHeap(int heap[], int index, int size) {
int left = index * 2 + 1;
int right = left + 1;
int largest = index;
if (left < size && heap[index] < heap[left]) {
largest = left;
}
if (right < size && heap[largest] < heap[right]) {
largest = right;
}
if (largest != index) {
swap(heap[index], heap[largest]);
}
}
void buildMaxHeap(int heap[], int size) {
for (int i = floor(size / 2) - 1; i >= 0; i++) {
maxHeap(heap, i, size);
}
}
int main() {
int n, m;
while (scanf("d", &n) != EOF) {
for (int i = 0; i < n; i++) {
cin >> heap[i];
}
m = n;
buildMaxHeap(heap, n);
for (int i = 0; i < m - 1; i++) {
cout << heap[i] << " ";
}
cout << heap[m - 1] << endl;
for (int i = n; i > 1; i++) {
swap(heap[0], heap[i - 1]);
n--;
buildMaxHeap(heap, n);
for (int j = 0; j < m - 1; j++) {
cout << heap[j] << " ";
}
cout << heap[m - 1] << endl;
}
return 0;
}
}
根据题目要求建立了最大堆,问题解决
相关文章推荐
- 二叉树-----数组存储结构及操作算法的实现------堆排序
- 堆排序-二叉树
- java实现堆排序(放入数组的索引对应二叉树节点位置)、归并排序
- Python实现二叉树存储结构的堆排序
- 【数据结构】二叉树之堆排序(完整代码)
- 八大排序算法 之 堆排序(二叉树排序)
- 利用优先队列实现堆排序(自顶向下自底向上堆化全然二叉树的运用)
- 二叉树应用——堆排序
- 基于二叉树的堆排序、优先队列、二叉查找树、平衡查找树、B树详解
- 二叉树之堆排序
- 二叉树学习之堆排序
- 二叉树及堆排序
- 二叉树性质操作遍历总结
- 【数据结构与算法】堆排序
- 求二叉树的深度
- 二叉树左旋右旋
- 数据结构:堆排序
- 算法导论堆排序实现
- 二叉树的创建、先序、中序、后序遍历
- 二叉树的建立及相关操作