关闭

堆排序的本质

标签: 堆排序算法
410人阅读 评论(0) 收藏 举报
分类:


堆排序的本质就是完全二叉树部分性质的应用。子树定点大于等于左右子树的根节点。左右子树的根节点顺序无要求。
2个注意点 1> 核心 调整后 若破坏了子树的堆特征,需要重新调整
2>完全二叉树的非叶子节点数求法 (很简单)



/*

a 数组名
s 节点在数组中的索引号
n 数组的大小
*/
void  heapadjust(int a[],int s,int n)

     int j.t;
     while(2*s+1 <  n)
     {
        j=2*s+1;
        if((j+1) < n)
        {
             if(a[j]<a[j+1])//左子树小于右子树,则需要比较右子树
                  j++;// 指向右子树
        }
        if(a[s] <  a[j]) //比较s与j为序号的数据
        {
            t=a[s];
            a[s]=a[j];
            a[j]=t;
            s=j;//子树堆被破坏,需要重新调整
         }
         else  //比较左右孩子均小则堆未被破话 ,无需调整
             break;
     }


}


void heapsort(int a[],int n)
{
    int t,i;
    int  j;//
//逐个处理完全二叉树的非叶子节点,构成自堆
    for(i= n/2 -1; i>=0; i--)
    {
         heapadjust(a,i,n);


    }
    for(i=n-1;i>0;i--)
    {
        t=a[0];
        a[0]=a[i];
        a[i]=t;//将最大节点值放在数组末尾
        heapadjust(a,0,i);//将a[0]至a[i]重新调整为堆
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1476286次
    • 积分:17562
    • 等级:
    • 排名:第574名
    • 原创:3篇
    • 转载:2036篇
    • 译文:0篇
    • 评论:118条
    文章分类
    最新评论