题目描述
给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。
输入
数据个数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
https://www.bilibili.com/video/BV1b7411N798?p=76
#include<iostream>
using namespace std;
void swap(int &a,int &b) {
a ^= b;
b ^= a;
a ^= b;
}
void print(int *A, int len) {
cout<<len<<" ";
for(int j = 1; j <= len; j++) {
cout<<A[j]<<" ";
}
cout<<endl;
}
void AdjustDown(int *A, int k, int len) {
A[0] = A[k];
for(int i = 2*k; i <= len; i*=2) {
if(i<len && A[i]>A[i+1])
i++;
if(A[0] <= A[i])
break;
else {
A[k] = A[i];
k = i;
}
}
A[k] = A[0];
}
void BuildMaxHeap(int *A, int len) {
for(int i=len/2; i > 0; i--) {
AdjustDown(A, i, len);
}
}
void HeapSort(int *A, int len) {
BuildMaxHeap(A, len);
print(A,len);
for(int i = len; i > 1; i--) {
swap(A[i], A[1]);
AdjustDown(A, 1, i- 1);
print(A,len);
}
}
int main() {
int n;
int arr[100]= {0};
cin>>n;
for(int i = 1 ; i <= n; i ++) {
cin>>arr[i];
}
HeapSort(arr,n);
return 0;
}