十大排序算法——堆排序(C语言)
文章目录
- 堆排序
- 堆排序基本思想
- 基本步骤
- 大顶堆法
- 小顶堆法
- 参考文献:
堆排序
百度百科介绍:
堆排序(英语: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语言)相关推荐
- 十大排序算法(C语言代码)
排序算法介绍: 排序是计算机程序设计过程中的重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列. 它之所以重要是因为查找操作非常重要,而有序的顺序表可以采用效率较高二分查找 ...
- 十大排序算法之堆排序
十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...
- 数据结构与算法:十大排序算法之堆排序
数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...
- 这或许是东半球分析十大排序算法最好的一篇文章
作者 | 不该相遇在秋天 转载自五分钟学算法(ID:CXYxiaowu) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强 ...
- 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...
码农有道 历史文章目录(请戳我) 关于码农有道(请戳我) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强烈建议先收藏然后 ...
- 【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章
原地址:https://mp.weixin.qq.com/s?__biz=MzIwNTc4NTEwOQ==&mid=2247486981&idx=1&sn=c63cd080be ...
- 这或许是东半球讲十大排序算法最好的一篇文章
作者 | 不该相遇在秋天 责编 | 程序员小吴 ## 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个 ...
- 程序员必备十大排序算法
程序员必备十大排序算法 常见排序算法 基本概念 插入排序 直接插入排序 排序思路 排序过程 代码实现 算法分析 折半插入排序 排序思路 排序过程 代码实现 算法分析 希尔排序 排序思路 排序过程 代码 ...
- 「干货总结」程序员必知必会的十大排序算法
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 绪论 身 ...
- 「归纳|总结」程序员必知必会的十大排序算法
微信搜一搜「bigsai」关注这个有趣的程序员 新人原创公众号,求支持一下!你的点赞三连肯定对我至关重要! 文章已收录在 我的Github bigsai-algorithm 欢迎star 本文目录 绪 ...
最新文章
- 总结PHP 7新增加的特性
- Win64 驱动内核编程-19.HOOK-SSDT
- java虚拟机规范这本书怎么样_JVM规范系列开篇:为什么要读JVM规范?
- flume案例-网络数据采集-启动flume
- 中医:看脚十秒钟可知身体疾病
- java 按钮 监听_Button的四种监听方式
- html提交表单给php邮件发送,在HTML表单中通过PHP自动发送电子邮件
- Jeecg 实现RESTful风格
- Spring JDBC和JdbcTemplate CRUD与DataSource示例
- linux 内存查看_Linux终端查看最消耗CPU内存的进程
- 在其他事件中repeater的取值
- 两个员工,一个做事认真但效率低,一个迟到早退但效率高,只能留一个我该留哪个?
- python画超长图-python 画长图
- PHP 26个英文字母递增
- 如何检测新移动硬盘--HD Tune Pro硬盘工具
- EJB----EJB 概念
- Linux服务器如何查看CPU占用率、内存占用、带宽占用
- 数值分析-列主元消去法
- python:sine之舞
- 面试初体验:经历七场面试大数据开发工程师岗位总结(一)
热门文章
- JSP与Servlet的区别与联系,JSP与JavaScript的区别
- 投影查询(2020-3-13)
- UGUI Text组件扩展
- C#项目”XXXXX”针对的是”.NETFramework,Version=v4.7.1”但此计算机没有安装它
- Java基础枚举(enum关键字)
- 输出100-1000之间的水仙花数 是三位数 水仙花数就是 每个位上的数字的三次方的和仍然为原数字 例如:153是一个“水仙花数“,因为153=1的三次方+5的三次方+3的三次方;
- mysql编译安装原理_Mysql源码编译安装主从复制
- 点击控件动态创建新页面
- ckeditor4.x操作之在页面中引入(一)
- 转载——yum源的超级简单配置