堆排序

堆排序是一种选择排序,其最好,最坏,平均时间复杂度均为O(nlogn),是一种不稳定的排序。

首先我们来认识一下堆的结构。

对于大顶堆,其根节点的值要大于左右孩子,小顶堆则相反。那么我们可以利用满二叉树的性质,用数组来存储堆结构。i是根节点,则左右孩子为2*i和2*i+1

堆排序的算法顺序如下:

1 首先建立初始大根堆。从第一个非叶子节点开始,不断调用调整堆函数。最终我们构建出一颗初始大顶堆。

2 交换a[1]待调整堆的最后一个元素i,然后对于1到i-1进行调整堆算法。重复执行n次即可。

#include<iostream>
#include<cstdio>
using namespace std;
int a[110],n;
void adjheap(int pos,int n)
{
    int key=a[pos];

    for(int i=pos*2;i<=n;i=i*2)
    {
        if(i<n&&a[i]<a[i+1])
            i++;
        if(key<a[i])
        {
            a[pos]=a[i];
            pos=i;
        }
        else
            break;
    }
    a[pos]=key;
}
void sort()
{
    for(int i=n/2;i>=1;i--)
        adjheap(i,n);
    for(int i=n;i>1;i--)
    {
        swap(a[1],a[i]);
        adjheap(1,i-1);
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort();
    for(int i=1;i<=n;i++)
        printf("%d ",a[i]);
}
原文地址:https://www.cnblogs.com/flightless/p/8587778.html