• 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语言 > 内部排序之堆排序的实现详解

内部排序之堆排序的实现详解

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

通过本文主要向大家介绍了堆排序详解,堆排序c语言实现,java实现堆排序,堆排序实现,堆排序c 实现等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
堆排序(Heap Sort)只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。
(1)基本概念
a)堆:设有n个元素的序列:
{k1, k2, ..., kn}
对所有的i=1,2,...,(int)(n/2),当满足下面关系:
                                                                  ki≤k2i,ki≤k2i+1
                                                  或            ki≥k2i,ki≥k2i+1
这样的序列称为堆。
堆的两种类型:
   根结点最小的堆----小根堆。
   根结点最大的堆----大根堆。
根结点称为堆顶,即:在一棵完全二叉树中,所有非叶结点的值均小于(或均大于)左、右孩子的值。
b)堆排序:是一种树型选择排序,特点是,在排序过程中,把R[1..n]看成是一个完全二叉树的存储结构,利用完全二叉树双亲结点和孩子结点的内在关系,在当前无序区中选择关键字最大(最小)的记录。
2)堆排序步骤:
1、从k-1层的最右非叶结点开始,使关键字值大(或小)的记录逐步向二叉树的上层移动,最大(或小)关键字记录成为树的根结点,使其成为堆。
2、逐步输出根结点,令r[1]=r[i](i=n,,n-1,...,2),在将剩余结点调整成堆。直到输出所有结点。我们称这个自堆顶到叶子的调整过程为“筛选”。
(3)要解决的两个问题:
1、如何由一个无序序列建成一个堆;
2、输出一个根结点后,如何将剩余元素调整成一个堆。
将一个无序序列建成一个堆是一个反复“筛选”的过程。若将此序列看成是一个完全二叉树,则最后一个非终端结点是第floor(n/2)个元素,由此“筛选”只需从第floor(n/2)个元素开始。
堆排序中需一个记录大小的辅助空间,每个待排的记录仅占有一个存储空间。堆排序方法当记录较少时,不值得提倡。当n很大时,效率很高。堆排序是不稳定的。
堆排序的算法和筛选的算法如第二节所示。为使排序结果是非递减有序排列,我们在排序算法中先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1个记录进行筛选,重新将它调整为一个“大顶堆”,然后将选得的一个关键字为最大的记录(也就是第一个元素)与当前最后一个记录交换(全局看是第n-1个),如此往复,直到排序结束。由到,筛选应按关键字较大的孩子结点向下进行。
堆排序的算法描述如下: 

 

用C语言代码实现如下:
</div> </div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

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

  • 内部排序之堆排序的实现详解

相关文章

  • 2017-05-28C/C++中的mem函数和strcopy函数的区别和应用
  • 2017-05-28c语言常见图片格式判断实例
  • 2017-05-28C语言 格式化读写文件详解
  • 2017-05-28利用C++的基本算法实现十个数排序
  • 2017-05-28ACE反应器(Reactor)模式的深入分析
  • 2017-05-28深入理解char *a与char a[]的区别
  • 2017-05-28基于C/C++ 常见误区详解
  • 2017-05-28Objective-C 消息传递机制详解
  • 2017-05-28C++按位异或运算符的使用介绍
  • 2017-05-28C语言new操作的安全性分析

文章分类

  • 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++ 中const 类型限定符不兼容问题
    • C++编程中逗号运算符和条件运算符的使用方法讲解
    • C++语言实现hash表详解及实例代码
    • 在屏幕上输出各种类型的数据
    • C语言完美实现动态数组代码分享
    • C++构造函数深度学习
    • c++几种基本的插入排序(图文)
    • C++使用递归方法求n阶勒让德多项式完整实例
    • C++堆排序算法的实现方法

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

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