五、堆排序(Heap Sort)

1. 基本思想:

堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。

2. 堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:

Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])

Unity3D教程:手游开发常用排序算法

堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。

3. 排序过程:

堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。

【示例】:对关键字序列42,13,91,23,24,16,05,88建堆

Unity3D教程:手游开发常用排序算法

Unity3D教程:手游开发常用排序算法

Unity3D教程:手游开发常用排序算法

Unity3D教程:手游开发常用排序算法

01

Procedure Sift(Var R :FileType; I, M : Integer);

02

//在数组R[I..M]中调用R[I],使得以它为完全二叉树构成堆。事先已知其左、右子树(2I+1 <=M)均是堆//

03

Begin

04

X := R[I]; J := 2*I; //J <=M, R[J]R[I]的左孩子//

05

While J <= M Do //若当前被调整结点R[I]有左孩子R[J]//

06

begin

07

If (J < M) And R[J].Key < R[J+1].Key Then

08

J := J + 1 //J指向关键字较大的右孩子//

09

//J指向R[I]的左、右孩子中关键字较大者//

10

If X.Key < R[J].Key Then //孩子结点关键字较大//

11

begin

12

R[I] := R[J]; //R[J]换到双亲位置上//

13

I := J ; J := 2*I //继续以R[J]为当前被调整结点往下层调整//

14

end;

15

Else

16

Exit//调整完毕,退出循环//

17

end

18

R[I] := X;//将最初被调整的结点放入正确位置//

19

End;//Sift//

20

21

Procedure HeapSort(Var R : FileType); //R[1..N]进行堆排序//

22

 Begin

23

  For I := N Div Downto 1 Do //建立初始堆//

24

   Sift(R, I , N)

25

  For I := N Downto 2 do //进行N-1趟排序//

26

   begin

27

    T := R[1]; R[1] := R[I]; R[I] := T;//将当前堆顶记录和堆中最后一个记录交换//

28

    Sift(R, 1, I-1) //R[1..I-1]重成堆//

29

   end

30

 End; //HeapSort//

六、几种排序算法的比较和选择

1. 选取排序方法需要考虑的因素:

(1) 待排序的元素数目n;

(2) 元素本身信息量的大小;

(3) 关键字的结构及其分布情况;

(4) 语言工具的条件,辅助空间的大小等。

2. 小结:

(1) 若n较小(n <= 50),则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。

(2) 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。

(3) 若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。 快速排序是目前基于比较的内部排序法中被认为是最好的方法。

(4) 在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关键字随机分布时,任何借助于“比较”的排序算法,至少需要O(nlog2n)的时间。

(5) 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。

Unity3D教程:手游开发常用排序算法 -下相关推荐

  1. 视频教程-红孩儿网狐Cocos经典棋牌开发教程-手游开发

    红孩儿网狐Cocos经典棋牌开发教程 中国早期游戏程序员,2003年起从事游戏程序开发,负责开发过多款游戏项目,曾担任大型端游<无限世界>自研引擎技术负责人,2012年起关注Cocos引擎 ...

  2. unity 如何运行demo_Unity手游开发札记——Unity线性空间下移动设备上烘焙变暗问题处理笔记...

    说明:该问题只适用于unity 5.x的版本,在2017+的版本中官方已经修复. 0. 写在之前 其实针对这个问题已经写了一篇很简单的填坑笔记了,但是UWA说希望那篇文章稍微扩充一下放到USpark系 ...

  3. 手游开发神器 cocos2d-x editor 教程聚合和代码下载(持续更新中)

    --------------游戏基础教程篇-------------已完成--------- 一 cocos2d-x editor工具下载和基础教程JS篇: 一 手游开发神器 cocos2d-x ed ...

  4. 视频教程-微信小程序系统教程python版[3/3阶段]_微信小程序支付-手游开发

    微信小程序系统教程python版[3/3阶段]_微信小程序支付 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试 ...

  5. Unity手游开发札记——移动平台的天气系统实现

    0. 牢骚 我发现,每个月的20+号是我有精力写博客的时间-- 这次项目算是经历的第一次严格意义上的渠道测试,更换了正式名称,见了更多玩家,开发组也经历的更多通宵--评价和数据如何暂时还未揭晓,趁着没 ...

  6. 一、Cocos2d-x/Qt,2D手游开发方案

    一.基础 Cocos2d-x v3.0:http://www.cocos2d-x.org/download/version#Cocos2d-x Qt v5.2:http://qt-project.or ...

  7. 视频教程-Layabox3D游戏视频教程-源码-手游开发

    Layabox3D游戏视频教程-源码 有多年Unity程序开发经验,有策划和美术设计的经验.愿意在csdn这个平台和大家一起分享! 金龙 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」, ...

  8. Cocos2d-Lua手游开发基础篇-何韬-专题视频课程

    Cocos2d-Lua手游开发基础篇-62875人已学习 课程介绍         Cocos2d-Lua是一个开源的移动游戏框架,可以轻松运行在iOS.Android.Blackberry等操作系统 ...

  9. 视频教程-使用Cocos2d-x 开发3D游戏-手游开发

    使用Cocos2d-x 开发3D游戏 中国早期游戏程序员,2003年起从事游戏程序开发,负责开发过多款游戏项目,曾担任大型端游<无限世界>自研引擎技术负责人,2012年起关注Cocos引擎 ...

最新文章

  1. Apollo仿真「训练有素」,长沙无人驾驶出租「轻车熟路」
  2. 精通python-轻松打造11周精通python计划(完结) | 软件库
  3. 快速构建Windows 8风格应用14-ShareContract概述及原理
  4. 大数据学习——虚拟机准备(改主机名)
  5. 1.6_quick_sort_快速排序
  6. Pycharm快捷键及常用设置【建议收藏】
  7. 经典排序算法(八)--选择排序Selection Sort
  8. 数据统计分析(SPSS)【8】
  9. nginx配置在线播放mp4格式视频
  10. 记一次springboot应用偶发502错误的排查过程
  11. KEGG 通路信息下载及其相关处理
  12. cat <<EOF语句的意思
  13. 数字信号处理——有限长离散变换
  14. 树莓派外接显示器黑屏_解决树莓派连接显示屏No Signal的问题
  15. 想转行做数据产品经理?这份书单赶紧收藏起来
  16. @Value注解获取不到配置值
  17. android studio 使用第三方模拟器连接方法,如MUMU模拟器
  18. 素玄科技有限公司 php,php实现简单算法1 - osc_sw6n0c3p的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. docker搭建webug4.0漏洞靶场
  20. softlayer iso_使用IBM SoftLayer标记简化操作

热门文章

  1. html鼠标移入显示图片动画,HTML5+CSS3鼠标移入移出图片生成随机动画_html/css_WEB-ITnose...
  2. 华为ensp模拟器 给路由器配置DHCP
  3. 02 LED的闪烁、模拟交通灯
  4. Mac全自动安装brew一键配置国内镜像源
  5. 统一用户认证和单点登录和授权的原理与流程
  6. UIImageView 显示不规则图片,类似微信聊天气泡图片展示效果
  7. oracle完整的练习,2021史上最全Oracle数据库基本操作练习题(含答案).docx
  8. DH算法 | 迪菲-赫尔曼Diffie–Hellman 密钥交换及RSA(学习笔记)
  9. Scratch3.0 二次开发环境部署(一)
  10. 使用PY003基于外部中断+定时器的方式实现NEC红外解码