堆排序算法——C/C++
堆排序
1. 算法思想
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
2. 实现原理
要实现从小到大的排序,就要建立大顶堆,即父节点比子节点都要大。
2.1、初始化数组,创建大顶堆。1. 大顶堆的创建从下往上比较,不能直接用无序数组从根节点比较,否则有的不符合大顶堆的定义。
2.2、交换根节点和倒数第一个数据,现在倒数第一个数据就是最大的。
2.3、重新建立大顶堆。1. 因为只有 array[0] 改变,其它都符合大顶堆的定义,所以可以根节点 array[0] 重新建立。
2.4、重复2.2、2.3的步骤,直到只剩根节点 array[0],即 i=1。
3. 动态演示
网上这个就展示的非常好
我再用图片稍微解释一下。
原始数据:array[]={49,38,65,97,76,13,27,49,10}
原始堆排序
创建大顶堆
从倒数第二行往上比较父节点和子节点(即从数据一半开始向前运算),把大的往上移动,小的向下移,直到符合大顶堆定义。
交换根节点和最后一个节点
重新创建大顶堆
接下来就一直循环即可得到堆排序结果
4. 完整代码
五个函数
交换函数:void swap(int array[],int x,int y)
初始化大顶堆函数:void BuildHeap(int array[],int size)
生成大顶堆函数:void Down(int array[],int i,int n)
排序函数:void heapSort(int array[],int size)
主函数:int main()
#include <stdio.h>void display(int array[], int size) {for (int i = 0; i < size; i++) {printf("%d ", array[i]);}printf("\n");
}void swap(int array[], int x, int y) {int key = array[x];array[x] = array[y];array[y] = key;
}// 从大到小排序
// void Down(int array[], int i, int n) {// int child = 2 * i + 1;
// int key = array[i];
// while (child < n) {// if (child + 1 < n && array[child] > array[child + 1]) {// child++;
// }
// if (key > array[child]) {// swap(array, i, child);
// i = child;
// } else {// break;
// }
// child = child * 2 + 1;
// }
// }// 从小到大排序
void Down(int array[], int i, int n) { // 最后结果就是大顶堆int parent = i; // 父节点下标int child = 2 * i + 1; // 子节点下标while (child < n) {if (child + 1 < n && array[child] < array[child + 1]) { // 判断子节点那个大,大的与父节点比较child++;}if (array[parent] < array[child]) { // 判断父节点是否小于子节点swap(array, parent, child); // 交换父节点和子节点parent = child; // 子节点下标 赋给 父节点下标}child = child * 2 + 1; // 换行,比较下面的父节点和子节点}
}void BuildHeap(int array[], int size) {for (int i = size / 2 - 1; i >= 0; i--) { // 倒数第二排开始, 创建大顶堆,必须从下往上比较Down(array, i, size); // 否则有的不符合大顶堆定义}
}void HeapSort(int array[], int size) {printf("初始化数组:");BuildHeap(array, size); // 初始化堆display(array, size); // 查看初始化结果for (int i = size - 1; i > 0; i--) {swap(array, 0, i); // 交换顶点和第 i 个数据// 因为只有array[0]改变,其它都符合大顶堆的定义,所以可以从上往下重新建立Down(array, 0, i); // 重新建立大顶堆printf("排序的数组:");display(array, size);}
}int main() {int array[] = {49, 38, 65, 97, 76, 13, 27, 49, 10};int size = sizeof(array) / sizeof(int);// 打印数据printf("%d \n", size);printf("排序前数组:");display(array, size);HeapSort(array, size);return 0;
}
5. 结果展示
(显示每次排序结果)
从小到大
从大到小
6. 算法分析
时间复杂度:
- 最好:O(n log n)
- 最坏:O(n log n)
- 平均:O(n log n)
空间复杂度:O(1)
稳定性:不稳定
堆排序算法——C/C++相关推荐
- 上标3下标6算法_图解堆排序算法
堆排序定义 一般来说,算法就像数学公式,前人经过不断优化和验证得到有规律性的公式留给后人使用,当然也会交给后人验证的思路.那么堆排序算法就是这样,它有基本固定的定义如下: 1.将数组构建为一颗有规则的 ...
- 9个元素换6次达到排序序列_一文带你读懂排序算法(三):堆排序算法
国庆节快乐~点击上方文字关注我们哦 堆是一种特殊的树形数据结构,其每一个结点都有一个值,通常提到的堆都是指一棵完全二叉树,根结点的值小于(或大于)两个子结点的值,同时,根结点的两个子树也分别是一个堆. ...
- 精通八大排序算法系列:二、堆排序算法
精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...
- 堆排序时间复杂度_堆排序算法
堆排序是指利用堆积树这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大.将待排序的数组建堆,然后不断 ...
- 【java排序】 归并排序算法、堆排序算法
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- JavaScript实现heapsort堆排序算法(附完整源码)
JavaScript实现heapsort堆排序算法(附完整源码) Heap.js完整源代码 MinHeap.js完整源代码 Comparator.js完整源代码 Sort.js完整源代码 HeapSo ...
- 经典排序算法(7)——堆排序算法详解
堆排序(Heap sort)是指利用堆(最大堆.最小堆)这种数据结构所设计的一种排序算法.堆是一个完全二叉树的结构,并同时满足如下性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 一.算法基 ...
- java 实现 堆排序算法_C程序实现堆排序算法
java 实现 堆排序算法 Heap Sort is a comparison-based sorting algorithm that makes use of a different data s ...
- java 堆排序算法_堆排序算法的讲解及Java版实现
这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下 堆是数据结构中的一种重要结构,了解了"堆"的概念 ...
- php+堆排序算法,PHP实现排序堆排序(Heap Sort)算法
算法引进: 在这里我直接引用<大话数据结构>里面的开头: 在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n - 1 次,本来这也可以理解,查找第一个数据 ...
最新文章
- ThumbProcess.exe错误的解决方法
- jQuery添加/改变/移除CSS类
- STM32学了很久,我还是不会做项目。
- 智慧城市的互联网大脑架构图:大社交网络与智慧城市结合是关键
- DDD:架构思想的旧瓶新酒?阿里等大厂却对它趋之若鹜!
- Apache JMeter教程
- PRISM ‘VS100COMNTOOLS’ not set. Cannot set the build environment
- 塞尔达传说雷电大剑位置_《塞尔达传说:荒野之息》全收集——双手武器(1)...
- ASP.NET AJAX入门系列
- iOS12.3正式版发布 iOS13亮相进入倒计时
- [转载] Python进程——multiprocessing.Event()|Barrier()
- html盒子中盒子排列,解析CSS的box model盒模型及其内的子元素布局控制
- mtk开机声音与关机声音修改(原创)
- 深度好文:这才是实际工作中的竞品分析
- HTML5期末大作业:影视视频网站设计——爱影评在线电影(10页面) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
- 如何将多个图片批量转换成pdf文件?
- CentOS7.5部署WeADMIN监控主机交换机配置[详解]
- 微信改微信号连接服务器,微信修改不了微信号是为什么 微信号怎么修改第二次最新强行修改教程...
- JSR 356 WebSocket (Java WebSocket 1.0) support is not available when running on Java 6. To suppress
- h3c linux驱动 wn612_安装Ubuntu双系统系列——64位Ubuntu安装H3C的INode客户端