堆排序
堆排序就是在反复的建堆,你如果是从小到大排序就是建大根堆,从大到小排序的话就是建小跟堆;
建大根堆的话,就是父亲结点大于左右孩子结点,所以根结点就是最大的点,每次将最大的点与数组最后一个点交换;
建堆代码:
void bulid_heap(int len){
for(int i=len-1;i>=0;i--)
heap(i,len);
}
heap函数:
void heap(int x,int len){
int ma=x;
int l=2*x+1;
int r=2*x+2;
if(l<len&&a[l]>a[ma]) ma=l;
if(r<len&&a[r]>a[ma]) ma=r;
if(ma!=x){
swap(a[x],a[ma]);
heap(ma,len);
}
}
完整代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e9+5;
int a[105];
void heap(int x,int len){
int ma=x;
int l=2*x+1;
int r=2*x+2;
if(l<len&&a[l]>a[ma]) ma=l;
if(r<len&&a[r]>a[ma]) ma=r;
if(ma!=x){
swap(a[x],a[ma]);
heap(ma,len);
}
}
void bulid_heap(int len){
for(int i=len-1;i>=0;i--)
heap(i,len);
}
void my_sort(int len){
bulid_heap(len);
for(int i=0;i<len;i++){
swap(a[0],a[len-i-1]);
heap(0,len-i-1);
}
}
int main(){
for(int i=0;i<6;i++) cin>>a[i];
my_sort(6);
for(int i=0;i<6;i++) cout<<a[i]<<" ";
cout<<endl;
return 0;
}