排序:简单排序-堆
来源:互联网 发布:记账软件电脑版 编辑:程序博客网 时间:2024/06/07 08:56
前言:
堆排序(Heapsort)是指利用堆积树(堆)这种 数据结构所设计的一种 排序算法,它是选择排序的一种。可以利用 数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是 完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即 A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
形象图:
代码展示:
/// <summary> /// 堆排序 /// </summary> /// <param name="arry"></param> public static void HeapSort(this int[] arry, int top) { List<int> topNode = new List<int>(); for (int i = arry.Length / 2 - 1; i >= 0; i--) { HeapAdjust(arry, i, arry.Length); } for (int i = arry.Length - 1; i >= arry.Length - top; i--) { int temp = arry[0]; arry[0] = arry[i]; arry[i] = temp; HeapAdjust(arry, 0, i); } } /// <summary> /// 构建堆 /// </summary> /// <param name="arry"></param> /// <param name="parent"></param> /// <param name="length"></param> private static void HeapAdjust(int[] arry, int parent, int length) { int temp = arry[parent]; int child = 2 * parent + 1; while (child < length) { if (child + 1 < length && arry[child] < arry[child + 1]) child++; if (temp >= arry[child]) break; arry[parent] = arry[child]; parent = child; child = 2 * parent + 1; } arry[parent] = temp; }
小结:
①只需做n-1趟排序,选出较大的n-1个 关键字即可以使得文件递增有序。
②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接 选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止
特点:
堆排序(HeapSort)是一树形 选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵 完全二叉树的 顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择 关键字最大(或最小)的记录
阅读全文
0 0
- 排序:简单排序-堆
- 简单的排序---堆排序
- 简单选择排序-->堆排序
- 堆排序<一> ---------简单结构堆排序
- 堆排序简单实现
- 堆排序 简单实现
- 简单易懂堆排序
- 简单理解堆排序
- 选择排序---简单选择排序 堆排序
- 选择排序:简单选择排序、堆排序
- 内部排序之选择排序:简单选择排序,堆排序
- 简单排序算法之堆排序
- 简单选择排序与堆排序
- java实现简单排序算法:堆排序
- 简单选择排序和堆排序
- 简单选择排序与堆排序
- 堆排序分析------简单明晰
- 简单堆排序(大根堆)
- 文章标题
- 刻板表征与潜抑置换
- 将tensorflow训练好的模型移植到android
- const与#define
- hdu 4763
- 排序:简单排序-堆
- 100-300间能被3整除得数的和
- java权限管理与用户角色权限设计
- break 和continue 区别以及用法。
- UIButton按钮自适应排布,自动换行
- zookeeper的分布式搭建步骤
- 学习笔记:Java 分类枚举和策略枚举(枚举的嵌套)
- delphi 开发二维码。
- Retrofit 请求网络数据 并适配到 ListView