8644 堆排序
时间限制:1000MS 代码长度限制:10KB
提交次数:1909 通过次数:1257
题型: 编程题 语言: G++;GCC
Description
用函数实现堆排序,并输出每趟排序的结果
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
第一行:初始建堆后的结果
其后各行输出交换堆顶元素并调整堆的结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
9 7 8 6 4 3 2 5 0 1
8 7 3 6 4 1 2 5 0 9
7 6 3 5 4 1 2 0 8 9
6 5 3 0 4 1 2 7 8 9
5 4 3 0 2 1 6 7 8 9
4 2 3 0 1 5 6 7 8 9
3 2 1 0 4 5 6 7 8 9
2 0 1 3 4 5 6 7 8 9
1 0 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
//交换函数 交换num数组 x y下标位置的值
void swap(int num[], int x, int y) {
int t = num[x];
num[x] = num[y];
num[y] = t;
}
//输出num数组
void check(int num[],int n) {
for (int i = 0; i < n; i++)cout << num[i] << " ";
cout << endl;
}
//插入parent 使以parent为父节点的树和它的两个子节点满足堆条件
void Heapify(int num[], int parent, int n) {
//递归结束条件 当父节点到边界的时候退出
if (parent >= n)return;
//下标为0开始存放值
//左子树
int c1 = parent * 2 + 1;
//右子树
int c2 = parent * 2 + 2;
//最大值先设为父节点
int max = parent;
//下面找 父节点和两个子节点的最大值
//子节点的范围不能越界
if (c1 <= n - 1 && num[c1] > num[max]) {
max = c1;
}
if (c2 <= n - 1 && num[c2] > num[max]) {
max = c2;
}
//如果max不为父节点 说明需要和其中的一个子节点交换
if (max != parent) {
//交换
swap(num, max, parent);
//交换后 当前的max值处的节点需要往下继续调整 直到叶子节点 所以递归下去
Heapify(num, max, n);
}
}
//数组一开始是乱序的 需要建立为堆
void buildHeap(int num[], int n) {
//从叶子节点的父节点开始往前进行建堆 直到根节点建堆后 整个数组即为一个堆
//最后一个叶子节点的父节点即为第一个父节点 从这里开始往前建堆
//根据式子 n从0开始存的树,通过叶子节点找父节点 式子是 (n-1)/2
int parent = ((n-1) - 1) / 2;
//然后从这里往前调整堆 直到根节点
for (int i = parent; i >= 0; i--) {
Heapify(num, i, n);
}
//调整完后输出
check(num, n);
}
void heap_Input_Adjust(int num[],int n) {
//这里从根节点开始输出
//最大值为根节点
for (int i = n - 1; i > 0; i--) {
//根节点和最后一个叶子节点进行交换
int t = num[0];
num[0] = num[i];
num[i] = t;
//交换后的树(除开根节点) 不满足堆,所以要调整为堆 新的堆长度为i(递减)
Heapify(num, 0, i);
//交换一个输出一次
check(num, n);
//直到i=1 已经排好了,退出 i=0会重复输出一次 所以条件为i>0
}
}
int main(void) {
ios::sync_with_stdio(0), cin.tie(0);
int n;
cin >> n;
int* num = new int[n];
for (int i = 0; i < n; i++) cin >> num[i];
buildHeap(num, n);
heap_Input_Adjust(num,n);
return 0;
}