文章目录

  • 堆排序
    • 堆排序基本思想
    • 基本步骤
    • 大顶堆法
    • 小顶堆法
      • 参考文献:

堆排序

百度百科介绍:
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图

堆排序基本思想

将一个待排序序列构建成一个大顶堆,大顶堆的根节点就是此序列的最大值,然后将根节点最大值与末尾元素进行交换,此时末尾元素就是最大值;再然后将序列剩余的n-1个序列重新构建成一个大顶堆,再把根节点值与n-1个序列末尾元素进行交换,此时就得到了n序列的第二大的值,依次反复执行,就得到有序序列了。

基本步骤

1.将无序序列构建成一个堆,根据升序选择大顶堆,降序选择小顶堆
2.将堆顶元素与末尾元素进行交换 ,把最大值(最小值1)放在数组末尾
3.把剩余的序列元素重新创建成堆结构,然后继续交换堆顶与末尾元素,反复执行建堆和交换,直到排序完毕

大顶堆法

#include <stdio.h>
#include <stdlib.h>//数值交换函数
void swap(int *a,int *b)
{int temp;temp = *a;*a = *b;*b = temp;
}
//调整大顶堆
void adjustHeap1(int a[],int i,int length)
{int temp = a[i];  //先取出当前元素ifor (int k = i*2+1 ; k < length ; k=k*2+1)  //从i节点的左子节点开始,也就是2i+1处开始{if (k+1 < length && a[k] < a[k+1])  //如果左子节点小于右子节点,k指向右子节点{k++;}if (a[k] > temp)  //如果子节点大于父节点,将子节点值赋给父节点(不用进行交换){a[i] = a[k];i = k;}else{break;}}a[i]=temp;  //将temp值放在最终的位置}
//堆排序法【大顶堆法(有小到大排序)】
void Heap_Sort1(int a[],int n)
{//构建大顶堆for (int i = n/2-1 ; i >= 0 ; i--)  {   //从最后一个非叶子节点从左至右,从下到上调整结构adjustHeap1(a,i,n);}//调整堆结构和交换堆顶元素与末尾元素for (int j = n-1 ; j > 0 ; j--){swap(&a[0],&a[j]);adjustHeap1(a,0,j);    //再次构建大顶堆}
}void main()
{int a[]={12,13,46,56,16,49,79,45,15,59};int n=sizeof(a)/sizeof(int);    //计算数组元素int i;Heap_Sort1(a,n);  //大顶堆法,由小到大for ( i = 0; i < n; i++){printf("%d ",a[i]);}system("pause");   //防止控制台闪退}

小顶堆法

//数值交换函数
void swap(int *a,int *b)
{int temp;temp = *a;*a = *b;*b = temp;
}
//调整小顶堆
void adjustHeap2(int a[],int i,int length)
{int temp =a[i];  //先取出当前元素ifor (int k = 2*i+1 ; k < length; k=k*2+1){if (k+1 < length && a[k] > a[k+1])  //如果左子节点大于右子节点,k指向右子节点{k++;  //k为关键字中较小的记录的下标}if (a[k] < temp )  //如果子节点小于父节点,将子节点值赋给父节点(不用进行交换){a[i] = a[k];i = k;}else{break;  //满足小顶堆条件,直接跳出}       }a[i] = temp;
}
//堆排序法【小顶堆法(有大到小排序)】
void Heap_Sort2(int a[],int n)
{//构建小顶堆for (int i = n/2-1; i >= 0; i--){//从最后一个非叶子节点从左至右,从下到上调整结构adjustHeap2(a,i,n);}//将整个根节点节点最后一个子节点进行交换for (int j = n-1; j > 0; j--){swap(&a[0],&a[j]);adjustHeap2(a,0,j);}}
void main()
{int a[]={12,13,46,56,16,49,79,45,15,59};int n=sizeof(a)/sizeof(int);    //计算数组元素int i;Heap_Sort2(a,n);  //小顶堆法,由大到小for ( i = 0; i < n; i++){printf("%d ",a[i]);}system("pause");   //防止控制台闪退}

参考文献:

图解排序算法(三)之堆排序
堆排序(最后一个非叶子节点的序号是n/2-1的推理)

有不对的地方请大家指教,在学习中。

十大排序算法——堆排序(C语言)相关推荐

  1. 十大排序算法(C语言代码)

    排序算法介绍: 排序是计算机程序设计过程中的重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列. 它之所以重要是因为查找操作非常重要,而有序的顺序表可以采用效率较高二分查找 ...

  2. 十大排序算法之堆排序

    十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...

  3. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  4. 这或许是东半球分析十大排序算法最好的一篇文章

    作者 | 不该相遇在秋天 转载自五分钟学算法(ID:CXYxiaowu) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强 ...

  5. 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...

    码农有道 历史文章目录(请戳我) 关于码农有道(请戳我) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强烈建议先收藏然后 ...

  6. 【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章

    原地址:https://mp.weixin.qq.com/s?__biz=MzIwNTc4NTEwOQ==&mid=2247486981&idx=1&sn=c63cd080be ...

  7. 这或许是东半球讲十大排序算法最好的一篇文章

    作者 | 不该相遇在秋天 责编 | 程序员小吴 ## 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个 ...

  8. 程序员必备十大排序算法

    程序员必备十大排序算法 常见排序算法 基本概念 插入排序 直接插入排序 排序思路 排序过程 代码实现 算法分析 折半插入排序 排序思路 排序过程 代码实现 算法分析 希尔排序 排序思路 排序过程 代码 ...

  9. 「干货总结」程序员必知必会的十大排序算法

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 绪论 身 ...

  10. 「归纳|总结」程序员必知必会的十大排序算法

    微信搜一搜「bigsai」关注这个有趣的程序员 新人原创公众号,求支持一下!你的点赞三连肯定对我至关重要! 文章已收录在 我的Github bigsai-algorithm 欢迎star 本文目录 绪 ...

最新文章

  1. 总结PHP 7新增加的特性
  2. Win64 驱动内核编程-19.HOOK-SSDT
  3. java虚拟机规范这本书怎么样_JVM规范系列开篇:为什么要读JVM规范?
  4. flume案例-网络数据采集-启动flume
  5. 中医:看脚十秒钟可知身体疾病
  6. java 按钮 监听_Button的四种监听方式
  7. html提交表单给php邮件发送,在HTML表单中通过PHP自动发送电子邮件
  8. Jeecg 实现RESTful风格
  9. Spring JDBC和JdbcTemplate CRUD与DataSource示例
  10. linux 内存查看_Linux终端查看最消耗CPU内存的进程
  11. 在其他事件中repeater的取值
  12. 两个员工,一个做事认真但效率低,一个迟到早退但效率高,只能留一个我该留哪个?
  13. python画超长图-python 画长图
  14. PHP 26个英文字母递增
  15. 如何检测新移动硬盘--HD Tune Pro硬盘工具
  16. EJB----EJB 概念
  17. Linux服务器如何查看CPU占用率、内存占用、带宽占用
  18. 数值分析-列主元消去法
  19. python:sine之舞
  20. 面试初体验:经历七场面试大数据开发工程师岗位总结(一)

热门文章

  1. JSP与Servlet的区别与联系,JSP与JavaScript的区别
  2. 投影查询(2020-3-13)
  3. UGUI Text组件扩展
  4. C#项目”XXXXX”针对的是”.NETFramework,Version=v4.7.1”但此计算机没有安装它
  5. Java基础枚举(enum关键字)
  6. 输出100-1000之间的水仙花数 是三位数 水仙花数就是 每个位上的数字的三次方的和仍然为原数字 例如:153是一个“水仙花数“,因为153=1的三次方+5的三次方+3的三次方;
  7. mysql编译安装原理_Mysql源码编译安装主从复制
  8. 点击控件动态创建新页面
  9. ckeditor4.x操作之在页面中引入(一)
  10. 转载——yum源的超级简单配置