#include<iostream>
#include<cstring>
using namespace std;
int arr[10010];//要排序的数据
int n;//一共有多少数据
void Max_heap(int arr[], int first, int last){
int par = first;
int son = par * 2 + 1;
while(son <= last){
if(son + 1 <= last && arr[son] < arr[son + 1]){
son++;
}
if(arr[par] > arr[son]){//如果满足,那么就直接返回
return;
}else{
int temp = arr[par];
arr[par] = arr[son];
arr[son] = temp;//交换顺序
par = son;
son = par * 2 + 1;//再次进入循环
}
}
}
void heap_sort(int arr[], int len){
for(int i = len / 2 - 1;i >= 0;i--){
//从最后一个非叶子节点开始往回走
Max_heap(arr, i, len-1);
}//先排好形成大顶堆
//下面代码:先将第一个元素和已经排好元素前一位作交换,再进行堆排序
for(int i = len - 1;i > 0;i--){
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
Max_heap(arr, 0, i - 1);
}
}
int main(){
cin>>n;
for(int i = 0;i < n;i++){
cin>>arr[i];
}
heap_sort(arr, n);
for(int i = 0;i < n;i++){
cout<<arr[i]<<" ";
}cout<<endl;
return 0;
}
堆排序代码
最新推荐文章于 2022-08-21 23:05:08 发布