算法 Heap sort
- // --------------------------------------------------------------------------------------------------------------------
- // <copyright file="Program.cs" company="Chimomo's Company">
- //
- // Respect the work.
- //
- // </copyright>
- // <summary>
- //
- // Heap sort.
- //
- // 堆排序是一种选择排序,时间复杂度为O(nlog<sub>2</sub>n)。
- // 堆排序的特点是:在排序过程中,将待排序数组看成是一棵全然二叉树的顺序存储结构,利用全然二叉树中父结点和子结点之间的内在关系,在当前无序区中选择keyword最大(或最小)的记录。
- //
- // 基本思想
- // 1.将待排序数组调整为一个大根堆。大根堆的堆顶元素就是这个堆中最大的元素。
- // 2.将大根堆的堆顶元素和无序区最后一个元素交换,并将无序区最后一个位置列入有序区,然后将新的无序区调整为大根堆。
- // 3.反复操作,直到无序区消失为止。
- // 初始时,整个数组为无序区。每一次交换,都是将大根堆的堆顶元素换入有序区,以保证有序区是有序的。
- //
- // </summary>
- // --------------------------------------------------------------------------------------------------------------------
- namespace CSharpLearning
- {
- using System;
- /// <summary>
- /// The program.
- /// </summary>
- public static class Program
- {
- /// <summary>
- /// 程序入口点。
- /// </summary>
- public static void Main()
- {
- int[] a = { 1, 14, 6, 2, 8, 66, 9, 3, 0, 10, 5, 34, 76, 809, 4, 7 };
- Console.WriteLine("Before Heap Sort...");
- foreach (int i in a)
- {
- Console.Write(i + " ");
- }
- Console.WriteLine("\r\n--------------------");
- Console.WriteLine("In Heap Sort...");
- HeapSort(a);
- Console.WriteLine("--------------------");
- Console.WriteLine("After Heap Sort...");
- foreach (int i in a)
- {
- Console.Write(i + " ");
- }
- Console.WriteLine(string.Empty);
- }
- /// <summary>
- /// 堆排序方法。
- /// </summary>
- /// <param name="a">
- /// 待排序数组。
- /// </param>
- private static void HeapSort(int[] a)
- {
- BuildMaxHeap(a); // 建立大根堆。
- Console.WriteLine("Build max heap:");
- foreach (int i in a)
- {
- Console.Write(i + " "); // 打印大根堆。
- }
- Console.WriteLine("\r\nMax heap in each iteration:");
- for (int i = a.Length - 1; i > 0; i--)
- {
- Swap(ref a[0], ref a[i]); // 将堆顶元素和无序区的最后一个元素交换。
- MaxHeaping(a, 0, i); // 将新的无序区调整为大根堆。
- // 打印每一次堆排序迭代后的大根堆。
- for (int j = 0; j < i; j++)
- {
- Console.Write(a[j] + " ");
- }
- Console.WriteLine(string.Empty);
- }
- }
- /// <summary>
- /// 由底向上建堆。由全然二叉树的性质可知,叶子结点是从index=a.Length/2開始。所以从index=(a.Length/2)-1结点開始由底向上进行大根堆的调整。
- /// </summary>
- /// <param name="a">
- /// 待排序数组。
- /// </param>
- private static void BuildMaxHeap(int[] a)
- {
- for (int i = (a.Length / 2) - 1; i >= 0; i--)
- {
- MaxHeaping(a, i, a.Length);
- }
- }
- /// <summary>
- /// 将指定的结点调整为堆。
- /// </summary>
- /// <param name="a">
- /// 待排序数组。
- /// </param>
- /// <param name="i">
- /// 须要调整的结点。
- /// </param>
- /// <param name="heapSize">
- /// 堆的大小,也指数组中无序区的长度。
- /// </param>
- private static void MaxHeaping(int[] a, int i, int heapSize)
- {
- int left = (2 * i) + 1; // 左子结点。
- int right = 2 * (i + 1); // 右子结点。
- int large = i; // 暂时变量,存放大的结点值。
- // 比較左子结点。
- if (left < heapSize && a[left] > a[large])
- {
- large = left;
- }
- // 比較右子结点。
- if (right < heapSize && a[right] > a[large])
- {
- large = right;
- }
- // 如有子结点大于自身就交换,使大的元素上移;而且把该大的元素调整为堆以保证堆的性质。
- if (i != large)
- {
- Swap(ref a[i], ref a[large]);
- MaxHeaping(a, large, heapSize);
- }
- }
- /// <summary>
- /// 交换两个整数的值。
- /// </summary>
- /// <param name="a">整数a。</param>
- /// <param name="b">整数b。
</param>
- private static void Swap(ref int a, ref int b)
- {
- int tmp = a;
- a = b;
- b = tmp;
- }
- }
- }
- // Output:
- /*
- Before Heap Sort...
- 1 14 6 2 8 66 9 3 0 10 5 34 76 809 4 7
- --------------------
- In Heap Sort...
- Build max heap:
- 809 14 76 7 10 66 9 3 0 8 5 34 1 6 4 2
- Max heap in each iteration:
- 76 14 66 7 10 34 9 3 0 8 5 2 1 6 4
- 66 14 34 7 10 4 9 3 0 8 5 2 1 6
- 34 14 9 7 10 4 6 3 0 8 5 2 1
- 14 10 9 7 8 4 6 3 0 1 5 2
- 10 8 9 7 5 4 6 3 0 1 2
- 9 8 6 7 5 4 2 3 0 1
- 8 7 6 3 5 4 2 1 0
- 7 5 6 3 0 4 2 1
- 6 5 4 3 0 1 2
- 5 3 4 2 0 1
- 4 3 1 2 0
- 3 2 1 0
- 2 0 1
- 1 0
- 0
- --------------------
- After Heap Sort...
- 0 1 2 3 4 5 6 7 8 9 10 14 34 66 76 809
- */
算法 Heap sort的更多相关文章
- 【算法】堆排序(Heap Sort)(七)
堆排序(Heap Sort) 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父 ...
- 堆排序 Heap Sort
堆排序虽然叫heap sort,但是和内存上的那个heap并没有实际关系.算法上,堆排序一般使用数组的形式来实现,即binary heap. 我们可以将堆排序所使用的堆int[] heap视为一个完全 ...
- Python入门篇-数据结构堆排序Heap Sort
Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树 每个非叶子结点都要大于或者等于其左右孩子结点 ...
- Insert or Merge && Insertion or Heap Sort
原题连接:https://pta.patest.cn/pta/test/1342/exam/4/question/27102 题目如下: According to Wikipedia: Inserti ...
- [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)
[Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...
- PTA Insertion or Heap Sort
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- 09-排序3 Insertion or Heap Sort
和前一题差不多,把归并排序换成了堆排序.要点还是每一次排序进行判断 开始犯了个错误 堆排序该用origin2 结果一直在排序origin ,误导了半天以为是逻辑错误...一直在检查逻辑 建立最大堆 排 ...
- 1098. Insertion or Heap Sort (25)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- 数据结构 - 堆排序(heap sort) 具体解释 及 代码(C++)
堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤: 第一步: 是建立大顶堆(从大到小排 ...
随机推荐
- JavaScript Array 对象的方法,比如push和unshift
https://www.runoob.com/jsref/jsref-obj-array.html js数组与字符串的相互转换 一.数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下: ...
- IDEA 注册问题,创建 和 删除项目
目录 .....2016.3/2017.1 IDEA 注册码 .....IDEA 创建项目 .....IDEA 删除项目 IDEA 注册码 复制使用别人的注册码,启动选择如下: 复制粘贴如下代码: 这 ...
- 在npm当中发布自己的包的方法
首先需要一个注册一个npm账号,注意,必须验证邮箱,不然是无法发布包的!下面是当时的报错 接着在你需要发布的包的文件夹下面打开你的cmd或者其他的命令行输入工具 输入 npm init 初始化你的 ...
- pat 甲级 团体天梯 L3-004. 肿瘤诊断
L3-004. 肿瘤诊断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶 ...
- POJ3983 快算24
很正常的题目,迷一样的答案. 测试数据只有一组,对没错只有一组. #include<cstdio> int main() { printf("5*(5-(1/5))\n" ...
- 【HDOJ5951】Winning an Auction(博弈DP)
题意:A和B两个人做一个拍卖游戏.每一轮两人分别给出一个价格,出价高者获得该轮的物品,出价相同则奇数轮A优先,偶数轮B优先. 两个人的目标都是最大化自己的商品数量,给定轮数n与两人分别的总资金a,b, ...
- 用IHTMLDocument2接口获取页面上想要的数据,代替正则表达式
原文发布时间为:2010-07-01 -- 来源于本人的百度文章 [由搬家工具导入] 1. 用 IHTMLDocument2::all 获得所有元素; 2. 用 IHTMLElementCollect ...
- .net3.5下使用LINQ递归算法实现简洁代码
原文发布时间为:2011-04-24 -- 来源于本人的百度文章 [由搬家工具导入] http://www.cnblogs.com/wintersun/archive/2009/03/29/14243 ...
- struts2 package 属性说明
package节点是整个配置的核心部分.每个package,从语义上讲,其实代表了每一个独立的模块.在这个模块中,你可以定义隶属于这个模块的行为方式,而与其他的模块没有关系.所以,每个package都 ...
- request库
0x00 环境简介和安装 我这里使用的是python2.7版本,直接使用pycharm2018这款IDE. 首先在pycharm中配置一下virtualenv环境,virtualenv是一个创建独立 ...