算法复习之堆排序

/*
*将两个元素进行交换
*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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值