堆排序

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. 算法分析

时间复杂度:

  1. 最好:O(n log n)
  2. 最坏:O(n log n)
  3. 平均:O(n log n)

空间复杂度:O(1)

稳定性:不稳定

堆排序算法——C/C++相关推荐

  1. 上标3下标6算法_图解堆排序算法

    堆排序定义 一般来说,算法就像数学公式,前人经过不断优化和验证得到有规律性的公式留给后人使用,当然也会交给后人验证的思路.那么堆排序算法就是这样,它有基本固定的定义如下: 1.将数组构建为一颗有规则的 ...

  2. 9个元素换6次达到排序序列_一文带你读懂排序算法(三):堆排序算法

    国庆节快乐~点击上方文字关注我们哦 堆是一种特殊的树形数据结构,其每一个结点都有一个值,通常提到的堆都是指一棵完全二叉树,根结点的值小于(或大于)两个子结点的值,同时,根结点的两个子树也分别是一个堆. ...

  3. 精通八大排序算法系列:二、堆排序算法

    精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...

  4. 堆排序时间复杂度_堆排序算法

    堆排序是指利用堆积树这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大.将待排序的数组建堆,然后不断 ...

  5. 【java排序】 归并排序算法、堆排序算法

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  6. JavaScript实现heapsort堆排序算法(附完整源码)

    JavaScript实现heapsort堆排序算法(附完整源码) Heap.js完整源代码 MinHeap.js完整源代码 Comparator.js完整源代码 Sort.js完整源代码 HeapSo ...

  7. 经典排序算法(7)——堆排序算法详解

    堆排序(Heap sort)是指利用堆(最大堆.最小堆)这种数据结构所设计的一种排序算法.堆是一个完全二叉树的结构,并同时满足如下性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 一.算法基 ...

  8. java 实现 堆排序算法_C程序实现堆排序算法

    java 实现 堆排序算法 Heap Sort is a comparison-based sorting algorithm that makes use of a different data s ...

  9. java 堆排序算法_堆排序算法的讲解及Java版实现

    这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下 堆是数据结构中的一种重要结构,了解了"堆"的概念 ...

  10. php+堆排序算法,PHP实现排序堆排序(Heap Sort)算法

    算法引进: 在这里我直接引用<大话数据结构>里面的开头: 在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n - 1 次,本来这也可以理解,查找第一个数据 ...

最新文章

  1. ThumbProcess.exe错误的解决方法
  2. jQuery添加/改变/移除CSS类
  3. STM32学了很久,我还是不会做项目。
  4. 智慧城市的互联网大脑架构图:大社交网络与智慧城市结合是关键
  5. DDD:架构思想的旧瓶新酒?阿里等大厂却对它趋之若鹜!
  6. Apache JMeter教程
  7. PRISM ‘VS100COMNTOOLS’ not set. Cannot set the build environment
  8. 塞尔达传说雷电大剑位置_《塞尔达传说:荒野之息》全收集——双手武器(1)...
  9. ASP.NET AJAX入门系列
  10. iOS12.3正式版发布 iOS13亮相进入倒计时
  11. [转载] Python进程——multiprocessing.Event()|Barrier()
  12. html盒子中盒子排列,解析CSS的box model盒模型及其内的子元素布局控制
  13. mtk开机声音与关机声音修改(原创)
  14. 深度好文:这才是实际工作中的竞品分析
  15. HTML5期末大作业:影视视频网站设计——爱影评在线电影(10页面) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  16. 如何将多个图片批量转换成pdf文件?
  17. CentOS7.5部署WeADMIN监控主机交换机配置[详解]
  18. 微信改微信号连接服务器,微信修改不了微信号是为什么 微信号怎么修改第二次最新强行修改教程...
  19. JSR 356 WebSocket (Java WebSocket 1.0) support is not available when running on Java 6. To suppress
  20. h3c linux驱动 wn612_安装Ubuntu双系统系列——64位Ubuntu安装H3C的INode客户端

热门文章

  1. python批量修改文件后缀名
  2. 完整的VBA代码宝助手(完全开源)
  3. USB Type C 接口引脚详解
  4. php字符串函数(1)长度计算、查找、截取
  5. 西门子PLC 1200和V20变频器USS通讯
  6. Java软件开发工程师简历模板包装教学问题完整版 【心静思远-9527】
  7. 图像识别的原理、过程、应用前景
  8. 二阶有源低通滤波电路的设计与分析
  9. 3D动漫游戏建模很难学?教你如何使用3DMax和ZBrush制作卡通角色
  10. cuda环境安装--windows离线安装