堆排序

#include<iostream>
#include<vector>
#include<set>
#include<cmath>
using namespace std;

int lChild(int i)
{
    return 2*i;
}

int rChild(int i)
{
    return 2*i + 1;
}

void swap(int &a, int &b)
{
    int t = a;
    a = b;
    b = t;
}

//min-heap
void sift_down(int a[], int n, int i)
{
    int min = i;
    int l = lChild(i);
    int r = rChild(i);

    if(l<=n && a[l]<a[min])
        min = l;
    
    if(r<=n && a[r]<a[min])
        min = r;
    if(i != min)
    {
        swap(a[i], a[min]);
        sift_down(a,n,min);
    }
}

void make_heap(int a[], int n)
{
    int i = 0;
    for(i=1; i<=n/2; i++)
    {
        sift_down(a,n,i);
    }
}

void heap_sort(int a[], int n)
{
    make_heap(a,n);
    int size = n;
    int i = 0;
    for(i=n; i>=1; i--)
    {
        swap(a[i],a[1]);
        size--;
        sift_down(a,size,1);
    }
}

int main()
{
    int a[100];
    int n;
    while(cin>>n)
    {
        int i = 0;
        for(i=1; i<=n; i++)
            cin>>a[i];
        heap_sort(a,n);
        for(i=1; i<=n; i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }
    return 0;
}
多学习,多总结。
原文地址:https://www.cnblogs.com/yanhaiming/p/2972402.html