堆排序

  堆排序(heapsort)是指利用堆这种数据结构的一种排序算法。堆是一个完全二叉树的结构,即堆结构除最后一层外,其他各层都是满的,且最后一层的结点都靠在左边,并同时满足子结点的值总是小于或者大于它的父结点的值。
  堆的基本操作:
  1.向堆中插入一个元素
  向有n个元素的堆中插入一个新元素,应当把元素放在n+1号结点,然后与其父结点比较大小,若大于其父结点,则保持了堆的性质,否则与其父结点交换,再向上比较,重复上述过程,直至不发生交换为止。
  2.删除最小元素
  直接删除根结点,把最后一个结点移动到根结点位置上,此时检查是否满足堆的性质,如果根结点比其儿子结点大,则与儿子结点中较小的一个交换,再向下比较,重复上述过程,直至不发生交换为止。
  上述在插入操作中运用到了向上调整,在删除操作中运用到了向下调整,时间复杂度都是O(logn)的。
  堆排序步骤:
  (1)建堆,将所有结点布置成堆结构;
  (2)取出堆顶结点,放入列表末尾;
  (3)把堆尾的结点移动至顶部,调整此结点;
  (4)跳转至(2)步骤,直至堆为空。

#include<cstdio>
using namespace std;
#define max 100000
int a[max],n,i,tot,t;

void down(int i)
{
    int t,j;
    while (i<=tot/2)
      {
        j=2*i;
        if ((j<tot) && (a[j+1]<a[j]))
          j++;
        if (a[i]>a[j])
          {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
            i=j;
          }
        else
          break;
      }
}

int main()
{
    scanf("%d",&n);
    for (i=1;i<=n;i++)
      scanf("%d",&a[i]);
    tot=n;
    for (i=n/2;i>=1;i--)
      down(i);
    for (i=1;i<=n;i++)
      {
        t=a[1];
        a[1]=a[tot];
        a[tot]=t;
        tot--;
        down(1);
      }
    for (i=n;i>=1;i--)
      printf("%d ",a[i]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值