堆排序算法(c 语言实现)

#include<stdio.h>

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


void max_heapify(int a[],int i,int size)  //用for循环来实现维护最大堆的性质
{
    int l,r,largest;
    int tmp,j;
    for (j=i;j<=size;j=largest)
    {
        l=left(j);
        r=right(j);
        if (l<=size && a[l]>a[j])
            largest=l;
        else
            largest=j;
        if (r<=size && a[r]>a[largest])
            largest=r;
        if (largest!=j)
        {
            tmp=a[j];
            a[j]=a[largest];
            a[largest]=tmp;
        }
        else
            break;
    }
}

void max_heapifyr(int a[],int i,int size)
{
    int l,r,largest;
    int tmp;
    l=left(i);
    r=right(i);
    if (l<=size && a[l]>a[i])  //先一左孩子结点比较
        largest=l;
    else 
        largest=i;
    if (r<=size && a[r]>a[largest])  //前者比较中的较大者与右孩子结点比较,就可以得到三者中的最大者,位置存储在largest中
        largest=r;
    if (largest!=i)   //如果左或者右孩子比i结点大,要相互交换,并且要继续递归左或者右孩子结点,直到最底部
    {
        tmp=a[i];
        a[i]=a[largest];
        a[largest]=tmp;
        max_heapify(a,largest,size);
    }

}


void build_max_heap(int a[],int len)
{
    int i;
    for( i=(len/2);i>=1;i--)  //从最后一个不是叶子结点的开始建堆
        max_heapify(a,i,len);
}

void heap_sort(int a[],int len)
{
    int i,tmp;
    build_max_heap(a,len);  //建立最大堆
    for (i=len;i>=2;i--) //从数组的最后一个开始排序
    {
        tmp=a[1];
        a[1]=a[i];
        a[i]=tmp;

        max_heapify(a,1,i-1);  //每次排完数组的数量减一个
    }
}


int main()
{
    int a[64];
    int n,i;
    printf("input the sum :\n");
    scanf("%d",&n);
    for (i=1;i<=n;i++)
        scanf("%d",&a[i]);
    heap_sort(a,n);

    printf("the sorted is:\n");
    for (i=1;i<=n;i++)
        printf("%d  ",a[i]);
    printf("\n");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值