堆排序

来源:互联网 发布:网络维护难点分析 编辑:程序博客网 时间:2024/06/05 05:19
思想:我认为这个排序最坑的地方是它开的数组从1记起(我因为0这个问题纠结了好久···),建大顶堆,每次顶和最后的叶子作比较,如果顶小,
      做交换,每循环一次确定好一个数的位置;建堆时最大非叶子节点为n/2,循环里每次建堆,左面下标成2*i排列,右面下标成2*i+1排列
 


解题代码:
#include <stdio.h>
#define N 100000
void Input(int a[],int n)
{
    int i;
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
}

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

void Adjust(int a[],int i,int n)
{
    int lchild=2*i;
    int rchild=2*i+1;
    int max=i;
    if(i<=n/2)
    {
        if(lchild<=n&&a[lchild]>a[max])
        {
            max=lchild;
        }
        if(rchild<=n&&a[rchild]>a[max])
        {
            max=rchild;
        }
        if(max!=i)
        {
            swap(&a[i],&a[max]);
            Adjust(a,max,n);
        }
    }
}

void Build(int a[],int n)
{
    int i;
    for(i=n/2;i>=1;i--)
    {
        Adjust(a,i,n);
    }
}

void Heap(int a[],int n)
{
    int i;
    Build(a,n);
    for(i=n;i>=1;i--)
    {
        swap(&a[1],&a[i]);
        Adjust(a,1,i-1);
    }

}

void Output(int a[],int n)
{
    int i;
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);
}

int main()
{
    int a[N],n;
    printf("请输入数据个数:\n");
    scanf("%d",&n);
    Input(a,n);
    Heap(a,n);
    Output(a,n);
    return 0;
}
0 0
原创粉丝点击