堆排序的本质

来源:互联网 发布:unity3d spine2d插件 编辑:程序博客网 时间:2024/05/22 07:56


堆排序的本质就是完全二叉树部分性质的应用。子树定点大于等于左右子树的根节点。左右子树的根节点顺序无要求。
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]重新调整为堆
    }
}
原创粉丝点击