经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
排序算法C语言实现——堆排序
来源:cnblogs  作者:Jo_ZSM  时间:2018/10/15 9:05:52  对本文有异议
/*
堆排
nlog(n)
*/
/*堆排复杂度分析
1、建堆((n*log(n))/2)
    循环n/2次,每次调用HeapAdjust函数
    HeapAdjust内部循环log(n)
2、调整堆(((n-1)log(n))/2)
    循环n-1次,每次调用HeapAdjust函数
    HeapAdjust内部循环log(n)
3、综合1、2,去除常数,总的复杂度为nlog(n)
*/
/*
功能:调整堆中指定的节点
输入:data-待调整的堆;pos-待调整的节点;len-总节点数
输出:data-调后的堆
*/
void HeapAdjust(int *data, size_t pos, size_t len)
{
    size_t iChild=pos*2 + 1;
    int iTemp=data[pos];/*待调整的节点*/
   
    /*每次选取比iTemp大的最大的子节点上移
      直到没有更大的子节点(break),
      或者没有子节点(iChild>=len)时,退出循环,保存待调整节点
    */
    while(iChild < len)
    {
        if(((iChild+1) < len) && (data[iChild] < data[iChild+1]))
        {
            ++iChild;
        }
        else
        {
            ;
        }
       
        if(iTemp < data[iChild])
        {
            data[pos] = data[iChild];
        }
        else
        {
            break;
        }
       
        pos = iChild;
        iChild = pos*2 + 1;
    }
   
    data[pos] = iTemp;
}
void HeapSort(int* data, size_t len)
{
    size_t pos=0;
    int iTemp=0;
   
    if(NULL == data)
    {
        /*throw("Invalid Parameter");*/
        return;
    }
    if(len < 2)
    {
        return;
    }
    else
    {
        pos = len/2; /*从最后一个有孩子的节点开始建堆*/
    }
   
    /*建堆,此时pos标示待调整的节点*/
    while(pos != 0)
    {
        --pos;
        HeapAdjust(data, pos, len);
    }
   
    /*循环换出堆顶并调整堆,此时pos标示堆的最后一个节点*/
    for(pos=len-1; pos>0; --pos)
    {
        iTemp = data[0];
        data[0] = data[pos];
        data[pos] = iTemp;
        HeapAdjust(data, 0, pos);
    }
}
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号