堆排序的本质

转载 2013年12月02日 23:57:42


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

David MacKay:用信息论解释 '快速排序'、'堆排序' 本质与差异

这篇文章是David MacKay利用信息论,来对快排、堆排的本质差异导致的性能差异进行的比较。 信息论是非常强大的,它并不只是一个用来分析理论最优决策的工具。 从信息论的角度来分析算法效率是一件...
  • cyh24
  • cyh24
  • 2012年10月21日 00:25
  • 3235

堆排序之Java实现

  • 2017年07月27日 17:03
  • 4KB
  • 下载

堆排序法.cpp

  • 2015年07月26日 12:45
  • 2KB
  • 下载

冒泡排序本质:N个数,需要N-1趟,每趟需要比较N-i次(i是指第i趟)如10个数需要比较9+8+7+6+5+4+3+2+1=45次

package none001; //冒泡排序。。。 //冒泡排序本质:N个数,需要N-1趟,每趟需要比较N-i次(i是指第i趟)如10个数需要比较9+8+7+6+5+4+3+2+1=45次 //无...

堆排序及其用途

  • 2016年03月25日 13:46
  • 214KB
  • 下载

堆排序算法c语言实现

  • 2015年10月25日 14:24
  • 2KB
  • 下载

算法导论复习(3) 堆排序

堆排序与归并排序具有相同的时间复杂度O(nlgn),但是在讲堆排序之前,先要搞清楚堆排序使用的“二叉堆” 二叉堆是一个数组,可以被看成近似的完全二叉树 特点: 1.树上每一节点对应一个元素,除...

堆排序

  • 2014年12月25日 21:57
  • 205KB
  • 下载

堆排序算法导论

  • 2013年11月11日 23:54
  • 152KB
  • 下载

堆排序小根堆 大根堆 迭代 递归 总结 完整代码

http://blog.csdn.net/morewindows/article/details/6709644/
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆排序的本质
举报原因:
原因补充:

(最多只允许输入30个字)