• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C# 排序算法之堆排序

C# 排序算法之堆排序

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#排序算法,c#冒泡排序算法代码,c#快速排序算法,c#冒泡排序算法,c#选择排序算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
一、基本概念

堆:这里是指一种数据结构,而不是我们在C#中提到的用于存储引用类型对象的地方。它可以被当成一棵完全二叉树。
binaryTree 
为了将堆用数组来存放,这里对每个节点标上顺序。事实上,我们可以用简单的计算公式得出父节点,左孩子,右孩子的索引:

    parent(i) = clip_image002[4]

    left(i) = 2i

    right(i)=2i + 1

最大堆和最小堆: 最大堆是指所有父节点的值都大于其孩子节点的堆,即满足以下公式:

                      A[parent[i]]clip_image002[6]A[i](A是指存放该堆的数组)

    最小堆相反。

    最大堆和最小堆是堆排序的关键,可知最大堆的根节点是堆中最大的节点。因此只要我们构造出最大(小)堆,最大(小)的元素也就得到了,然后再对剩下的元素继续构造最大(小)堆,就可以取出第二大(小)的元素,依此类推,直到排序完成。

二、构造最大(小)堆
我们已经得知构造最大(小)堆是堆排序的关键,下面就来看看如何构造最大堆。
万事开头难,首先来看一种特殊的情形吧:堆的根节点的左子树和右子树都已经是最大堆了,然而根节点却比孩子节点小,当然,这个堆不满足最大堆的定义。为了⑩这个堆成为最大堆,我们可以按如下步骤操作:
(1)将根节点与左右孩子中最大的交换
(2)交换之后可能会面临左或右子树不是最大堆的问题,但由于整个左(右)子树一开始就是最大堆,问题又回到了最开始的状态,因此只要如此反复即可得到最大堆。
对于上面的特殊堆已经找到了解决办法,但对于一般意义上的堆呢?
我们可以选择自底向上来构造:叶子节点是特殊的最大堆,举个例子有叶子节点a,b,它们的父节点是p;a,b肯定已经是最大堆了,这是要保证a,b,p组成的子树是最大堆。这个堆很眼熟是不是?没错,它就是前面提到的特殊的堆。在a,b,p组成的子树变成最大堆后,我们又可以类似的使该子树,该子树的父节点,以及同胞子树(或节点)组成的新子树成为最大堆,如此类推,最终使堆变为最大堆。

对于求解最小堆与此类似。
三、实现
完整代码:

1.MaxHeapfy:该方法的前提是index处节点的左右子树已经是最大堆,最终的目的是使以index处节点为根的堆成为最大堆

2.BuildMaxHeap:该方法涉及一个事实:如果一个对含n个元素,那么从clip_image002开始的元素(假设节点下表从1开始)就一定是叶子节点(这一点可以用反证法证明,假设clip_image002[4]处节点不是叶子节点,那么该节点必包含子节点,从而可以得出其左孩子的索引2 *(clip_image002[6]) > n的结论,显然这是错误的)。在这个前提下,该方法至底向上通过MaxHeapfy将堆构建成最大堆。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#递归算法之打靶算法分析
  • C#算法函数:获取一个字符串中的最大长度的数字
  • C#递归算法之快速排序
  • C#递归算法寻找数组中第K大的数
  • C#用递归算法解决经典背包问题
  • C#算法设计之关于1000瓶水的问题
  • C#排序算法的比较分析
  • C#实现的优酷真实视频地址解析功能(2014新算法)
  • C#常见算法面试题小结
  • c# 快速排序算法

相关文章

  • 2017-05-28MessageBox的Buttons和三级联动效果
  • 2017-05-28c#协变和逆变实例分析
  • 2017-05-28学会使用C#异常
  • 2017-05-28C#实现字体旋转的方法
  • 2017-05-28C#编程实现连接SQL SERVER数据库实例详解
  • 2017-05-28newtonsoft.json解析天气数据出错解决方法
  • 2017-05-28C#实现的Windows剪贴板监视器功能实例【附demo源码下载】
  • 2017-05-28C#给Excel添加水印实例详解
  • 2017-05-28C#基础之Lambda表达式用法实例教程
  • 2017-05-28C#中创建PDF网格并插入图片的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 理解C#编程中的静态类和静态成员以及密封类
    • c# 自定义泛型链表类的详解
    • C# 设置系统日期格式的方法
    • 重写、隐藏基类(new, override)的方法
    • C# 类的声明详解
    • C#删除文件目录或文件的解决方法
    • C#实现把txt文本数据快速读取到excel中
    • C#中使用基数排序算法对字符串进行排序的示例
    • .Net笔记:System.IO之Stream的使用详解
    • C#无损高质量压缩图片实现代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有