关闭

算法复习之堆排序

标签: 堆排序
188人阅读 评论(0) 收藏 举报
/*
*将两个元素进行交换
*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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:29402次
    • 积分:938
    • 等级:
    • 排名:千里之外
    • 原创:60篇
    • 转载:34篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论