【面试题】--手写堆排序

前言

因为是面对面试场景,所以原理什么的就不讲,网上一搜一大把,假设看到这篇博客的人都会堆排序的原理了。

我就大概的用最简单的代码实现了下。毕竟面试这么一个水题写半个小时也不太好吧。

实现中遇到的困难:

数组下标必须要从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
*/

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/106954896
今日推荐