堆排序-----数据结构

      堆排序
前不久,我们数据结构刚刚学习到,堆排序。个人觉得堆排序比较好,因为比较稳定的时间复杂度。n(logn) 时间复杂度。
       如果想要学会堆排序,需要知道,二叉树。堆就和二叉树长的一模一样。

下面说说堆排序:
堆排序的思想就是用到堆的特点, 大顶堆,小顶堆,简单说,
      大顶堆就是:这一棵完全二叉树的任意一个节点都满足该节点的值大于等于他的左右孩子节点,
      小顶堆: 一棵完全二叉树的任意一个节点都满足该节点的值小于等于他的左右孩子节点,
因为这棵树的根节点是这棵树(堆) 中,如果是大顶堆就是max,小顶堆就是min,

比如我已大顶堆为例讲一下,大顶堆的个人根节点是最大值,只需要将根节点与最后一个数换一下,然后,把最后一个数除开不看,剩下的n-1个数字也是一棵完全二叉树,再将这棵树维护成大顶堆,不断重复到最后,就排好序了。

这样便得到一个虫小到大的数组。OVER

/******************
       Heap Sort
******************/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;


void BigHeap(int *a,int i,int len)//维护堆
{
    int l=(i<<1)+1,r=(i<<1)+2;
    int temp=a[i],flag=0;
    if(i<len/2)
    {
        if(l<len&&a[l]>temp)
        {
            flag=l;
            temp=a[l];
        }
        if(r<len&&a[r]>temp)
        {
            flag=r;
        }
    }
    if(flag)
    {
        swap(a[i],a[flag]);
        BigHeap(a,flag,len);
    }
}

void BuildHeap(int *a,int len)// 构建初始堆
{
    for(int i=len/2-1; i>=0; i--)
    {
        BigHeap(a,i,len);
    }
}
void HeapSort(int *a,int len)
{
    BuildHeap(a,len);
    for(int i=len; i>0; i--)
    {
        swap(a[0],a[i-1]);
        BigHeap(a,0,i-1);
    }
}

int main()
{
    int n;
    while(cin>>n)
    {
        int a[1000];
        for(int i=0; i<n; i++)
            cin>>a[i];
        HeapSort(a,n);
        int flag=0,tp=a[0];
        for(int i=1; i<n; i++)
        {
            if(a[i]<a[i-1])
            {
                flag=1;
                break;
            }
        }
        //for(int i=0;i<n;i++)
        if(flag) printf("erorr\n");
        else printf("Accepted\n");
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值