前言
因为是面对面试场景,所以原理什么的就不讲,网上一搜一大把,假设看到这篇博客的人都会堆排序的原理了。
我就大概的用最简单的代码实现了下。毕竟面试这么一个水题写半个小时也不太好吧。
实现中遇到的困难:
数组下标必须要从0开始 0 对应左右节点:(1,2)
如果从1 开始 对应:(3,4), 2对应(5,6)那么1 2 节点之间就没有联系了,不太好。数组下标必须要从0开始
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,b[N];
void Maxheadp(int a[],int n,int id)//id id*2+1 id*2+2
{
int l=id*2+1,r=id*2+2;
int mx=id;
if(l<n&&a[l]>a[mx]) mx=l;
if(r<n&&a[r]>a[mx]) mx=r;
if(mx!=id){
swap(a[mx],a[id]);
Maxheadp(a,n,mx);
}
}
void headsort(int a[],int n)
{
for(int i=n/2;i>=0;--i){//建堆
Maxheadp(a,n,i);
}
int id=0,len=n;
for(int i=len-1;i>=0;--i){//取堆顶与数组最末尾交换 并且重新布置一下大顶堆
swap(a[0],a[len-1]);
len--;
Maxheadp(a,len,0);
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;++i) scanf("%d",&a[i]);
headsort(a,n);
puts("排序后");
for(int i=0;i<n;++i) printf("%d ",a[i]);
puts("");
}
/*
5
4 5 3 2 1
6
1 5 4 23 23 98
*/