【id:315】【20分】B. DS内排—堆排序
时间限制1s
内存限制128MB
题目描述
给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。
输入
数据个数n,n个整数数据
输出
初始创建的小顶堆序列
每趟交换、筛选
后的数据序列,输出格式见样例
输入样例
8 34 23 677 2 1 453 3 7
输出样例
8 1 2 3 7 23 453 677 34
8 2 7 3 34 23 453 677 1
8 3 7 453 34 23 677 2 1
8 7 23 453 34 677 3 2 1
8 23 34 453 677 7 3 2 1
8 34 677 453 23 7 3 2 1
8 453 677 34 23 7 3 2 1
8 677 453 34 23 7 3 2 1
// 堆排序(小根堆)
#include "iostream"
using namespace std;
const int N = 9;
int arr[N] = {0};
int len;
// 打印数组
void print() {
cout << len << " ";
for (int i = 1; i <= len; i++) {
cout << arr[i];
if (i <= (len - 1)) cout << " ";
}
cout << endl;
}
// 根堆调整
void HeapAdjust(int k,int num) {
int i = k, j = 2 * k;
while (j <= num) {
if (arr[j] > arr[j + 1] && j+1 <= num) { // 这里如果不对j+1进行限制的话就会对抛弃的数据再次利用 发生错误!!!
j++;
}
// 实现交换
if (arr[i] > arr[j])
swap(arr[i], arr[j]);
i = j;
j = 2 * i;
}
}
// 堆排序
void HeapSort(){
// 初始建成小根堆
for(int i = len/2;i >= 1;--i){
HeapAdjust(i,len);
}
print(); // 打印初始化后的堆
for(int i = len;i > 1;--i){
// 交换顶点与尾节点
swap(arr[1],arr[i]);
// 只有顶点堆发生改变 只需要对顶点堆进行调整即可
HeapAdjust(1,i-1);
print();
}
}
int main(){
cin >> len;
for(int i = 1;i <= len;i++) cin >> arr[i];
HeapSort();
return 0;
}