算法复习之堆排序

原创 2015年07月09日 14:44:11
/*
*将两个元素进行交换
*params *p ,*q待交换的两个元素的指针
*/
void swap(int *p,int *q)
{
    int temp ;
    temp = *p ;
    *p = *q ;
    *q = temp ;
}
/*
*堆向下调整
*list:堆的数组,hole:待调整的数据,len:待调整的堆的大小
*/
void HeapAdjust(int *list,int hole,int len)
{
    int lChild = 2*hole ;//左孩子
    int rChild = 2*hole+1 ;//右孩子
    int Max = hole ;//记录
    if(hole <=len/2)//如果是叶子节点则不需要调整
    {
        if(lChild<=len && list[Max] < list[lChild])//list[Max]小于左孩子
            Max = lChild ;                  //调整Max为lChild
        if(rChild<=len && list[Max] < list[rChild])//list[Max]小于右孩子
            Max = rChild ;                      //调整Max为rChild
        if(Max!=hole)           //如果孩子节点大于待调整的节点
        {
            swap(&list[Max],&list[hole]) ;  //交换孩子节点与待调整节点的值
            HeapAdjust(list,Max,len) ;  //将孩子节点的值继续向下调整
        }
    }
}
/*
*建立堆
*params list:待建立堆的数组,len:list的长度
*/
void buildHeap(int*list,int len)
{
    int i ;
    for(i = len/2;i>=1;i--) //将从最后一个非叶子节点进行向下调整
    {
        HeapAdjust(list,i,len) ;//堆的第i个节点向下调整
    }
}
/*
*堆的排序
*params list:堆,len:堆的大小
*/
void HeapSort(int*list,int len)
{
    int i ;
    buildHeap(list,len) ;//建立大顶堆

    std::cout<<"大顶堆如下所示:";
    for(i = 1;i<=len;i++)
        std::cout<<list[i]<<"  ";
    std::cout<<std::endl;
    //排序
    for(i = len;i>=1;--i)
    {
        swap(&list[1],&list[i]) ;//将大顶堆元素与数组的最后一个位置交换,即出堆
        HeapAdjust(list,1,i-1) ;//调整堆
    }
}
void testHeap()
{
    int a[] = {-1,8,5,2,4,9,0,1,6,7,3} ;//建立堆的元素从a[1.....10],a[0]保留
    HeapSort(a,10) ;
    for(int i = 1 ;i<=10;i++)
        std::cout<<a[i] <<" ";
    std::cout<<std::endl;
}
int main()
{
    testHeap() ;
    system("pause") ;
    return 0 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

算法复习(1) 堆排序

堆是一种完全二叉树结构,以数组储存堆的最后一层从左开始填充对于元素个数为n的堆来说,高度为 floor(lgn)对于给定下标i (从0开始),父节点,左儿子,右儿子分别为:PARENT(i) ...

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

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

堆排序算法c语言实现

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

堆排序算法导论

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

复习数据结构:排序算法(六)——堆排序

对于堆排序,前面一篇博文中已经复习到了堆排序,这里就简单介绍一下,并给出核心部分的解释。     堆排序是一种不稳定的排序,也是内排序。     时间复杂度为O(nlogn)。 ...

堆排序算法

  • 2013年10月27日 09:53
  • 5KB
  • 下载

堆排序算法详细配图讲解

  • 2013年12月18日 21:11
  • 556KB
  • 下载

5. 堆,建堆算法,堆排序

堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大...

堆排序最大堆【算法导论】

  • 2014年01月08日 20:21
  • 250KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法复习之堆排序
举报原因:
原因补充:

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