/*
堆排
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. 计算机中如何实现除数是2的幂次的除法【转载自CSDN】

    前言: 本来是在看汇编里面的数据条件传送指令,做习题的时候看着这么一道有关于2的幂次方除法的题目.结果傻眼了,又尼玛不会了.........第二章看的时候就稀里糊涂的,看了几遍也没看太懂,这回又涉及到 ...

  2. mysql 维护添加远程主机访问

    https://www.cnblogs.com/JNUX/p/6936548.html

  3. Lock简介

    digest synchronized已经提供了锁的功能,而且还是Java的内置特性,那为什么还要出现lock呢? 用一句话来讲就是——synchronized可以实现同步,但太死板了它的同步机制:l ...

  4. python学习之内部函数:

    python内置函数表:https://docs.python.org/3/library/functions.html 1 判断数据类型的函数:isinstance(变量, 待要判断的类型) 2判断 ...

  5. 牛客网Java刷题知识点之什么是cookie、什么是session、cookie和session有什么区别

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21170&query=&asc= ...

  6. (转)Unity中使用C#实现Zip包的压缩与解压

    使用SharpZipLib库,下载地址为:http://icsharpcode.github.io/SharpZipLib/ /************************************ ...

  7. git命令收集

    $ git clone ... $ git status 查看状态 $ git commit -am "XXX" 提交信息 $ git commit -am "XXXX& ...

  8. 从Assets读取文件 用scanner扫描inputstream

    代码如下: 对InputStream的处理,从assets获取数据 InputStream in; try { in = getAssets().open("Android05.txt&qu ...

  9. 面向 AWS 专家的 Azure 云服务介绍

    本文是面向 AWS 专家的 Azure 云服务介绍,参考本文可以帮助大家“按图索骥”在 Azure 的平台上找到能满足自己需求的服务. 公有云市场经过多年发展,已经涌现出几家大规模的提供商,如 Azu ...

  10. Robot Framework(十三) 执行测试用例——创建输出

    3.5创建输出 执行测试时会创建几个输出文件,并且所有这些文件都与测试结果有某种关联.本节讨论创建的输出,如何配置它们的创建位置以及如何微调其内容. 3.5.1不同的输出文件 输出目录 输出文件 日志 ...