/*
堆排
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);
    }
}

排序算法C语言实现——堆排序的更多相关文章

  1. 排序算法c语言描述---堆排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序.具体思路分析不 ...

  2. 排序算法c语言描述---冒泡排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  3. 排序算法c语言描述---选择排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  4. 【转】九大排序算法-C语言实现及详解

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  5. 快色排序算法(C语言描述)

    快速排序 算法思想 快速排序采用了一种分治策略,学术上称之为分治法(Divide-and-Conquer Method). 哨兵(如下算法中的key) 每趟排序将哨兵插入到数组的合适位置,使得哨兵左侧 ...

  6. 排序算法C语言实现

    大学有一门课程叫做数据结构,严蔚敏的课本,其中详细介绍了集中经典的排序算法,学习复习反复几次,但是直到现在仍然只记得名字了,所以想记录下来,随时复习直至牢记于心.经常面试的朋友知道,排序算法在面试中出 ...

  7. 排序算法C语言实现——冒泡、快排、堆排对比

    对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) ...

  8. 排序算法的c++实现——堆排序

    我们利用最大堆可以实现数组从小到大的原址排序,利用最小堆的可以实现对数组从大到小的原址排序. 1  二叉堆的简单介绍: 最大堆与最小堆可以当作通过数组来实现的一个完全二叉树,除了最底层之外其它层都是满 ...

  9. 排序算法(三)堆排序及有界堆排序Java实现及分析

    1.堆排序基数排序适用于大小有界的东西,除了他之外,还有一种你可能遇到的其它专用排序算法:有界堆排序.如果你在处理非常大的数据集,你想要得到前 10 个或者前k个元素,其中k远小于n,它是很有用的. ...

随机推荐

  1. shell 中的if语句

    if [ t != "." -a t != ".." ] 之前一直不知道 -a 是什么意思,后来才知道     -a = and  ;    -o = or

  2. js验证textarea里面是否有换行符

    var reg = /[\r\n]+/g;if(reg.test(reason)){ PopAlert("不能有换行符!"); return;}

  3. MFC程序添加快捷键

    [问题提出]     有的程序需要自定义组合键完成一定功能,如何实现? [解决方法]     RegisterHotKey函数原型及说明:     BOOL RegisterHotKey(     H ...

  4. azure 创建redhat镜像帮助

    为 Azure 准备基于 Red Hat 的虚拟机 从 Hyper-V 管理器准备基于 Red Hat 的虚拟机 先决条件 本部分假定你已经从 Red Hat 网站获取 ISO 文件并将 RHEL 映 ...

  5. 最详细的github快速入门教程

    一:下载github 二:安装GitHub 下载之后点击 进行安装过程,安装之后桌面上会有两个图标,如下图 三:新建项目 GitHub是图形界面模式,Git Shell是命令行模式,在Windows系 ...

  6. 指定ip地址登陆服务器

    [root@localhost ~]# cat /etc/hosts.allow ## hosts.allow   This file contains access rules which are ...

  7. iOS 字符串处理笔记

    iOS字符串处理笔记,包括如何使用正则表达式解析,NSScanner扫描,设置和使用CoreParse解析器来解析处理自定义符号等内容 搜索 在一个字符串中搜索子字符串 最灵活的方法 - (NSRan ...

  8. MySQL索引使用等

  9. vector容器类型

    vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象).vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的. vector的构造   函数原型: tem ...

  10. Openjudge 2.5 6264:走出迷宫

    总时间限制:  1000ms 内存限制:  65536kB 描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n* ...