数据结构之堆排序

ppt(原创):

https://files.cnblogs.com/files/eastblue/%E5%A0%86%E6%8E%92%E5%BA%8F.pptx

视频(原创):

https://www.bilibili.com/video/av16199074/

 

代码:

#include<cstdio>
#include<cstring>

const int maxn=1e9+7;
int b[50050];

void fun(int a[],int i)//a数组i节点完成操作 
{
    int l=sizeof(a),t;
    while(2*i+1<l)
    {
        t=a[i];
        if(2*i+2<l)//有两个孩子节点 
        {
            if(a[2*i+1]<=a[2*i+2]&&a[2*i+1]<a[i]) //与左孩子交换 
            {
                a[i]=a[2*i+1];
                a[2*i+1]=t;
                i=2*i+1;
            }
            else if(a[2*i+2]<a[2*i+1]&&a[2*i+2]<a[i])//与右孩子交换 
            {
                a[i]=a[2*i+2];
                a[2*i+2]=t;
                i=2*i+2;
            }
            else
                break;
        }
        else//只有一个孩子节点 
        {    
            if(a[2*i+1]<a[i])
            {
                a[i]=a[2*i+1];
                a[2*i+1]=t;
                i=2*i+1;
            } 
            else
                break;
        }            
    }
    
}

void heapsort(int a[])
{
    int l=sizeof(a);
    for(int i=(l-2)/2;i>=0;i--)//数组从0开始,所以从(l-2)/2开始’筛选‘,(对应ppt第二步) 
    {
        fun(a,i);        
    }

    for(int i=1;i<=l;i++)//(对应ppt第三步) 
    {
        b[i-1]=a[0];
        a[0]=a[l-i];
        a[l-i]=maxn;
        fun(a,0);
    }
    
    for(int i=0;i<l;i++) 
         a[i]=b[i];
 } 
 
 int main()
 {
     int array[8]={49,38,65,97,76,13,27,49};
     heapsort(array);
     for(int i=0;i<8;i++)
     printf("%d ",array[i]);
 }

 

posted @ 2017-11-10 23:23  东流vip  阅读(166)  评论(0编辑  收藏  举报