[AS功能代码教程10] 数据结构排序算法

一、概论

对于数据的处理工作,排序是其最基本的运算之一。在当今的计算机系统中,花费在排序上的时间占系统CPU运行时间的很大比重。有资料表明,在一些商用计算机上,在排序上的CPU时间达到20%至60%。为了提高计算机的工作效率,人们提出了各种各样的排序方法和算法。这些算法有力地发展、并充分地展示了算法设计的某些重要原则和高超技巧。因此,对于计算专业人员来说掌握排序算法是十分重要的。

二、排序算法简介

本次课程中我们将介绍六种排序方法:插入排序,选择排序,冒泡排序,希尔排序,快速排序及二路归并。

<1>直接选择排序(Selection Sort):简单的选择排序,它的比较次数一定:n(n-1)/2。也因此无论在序列何种情况下,它都不会有优秀的表现(从上100K的正序和反序数据可以发现它耗时相差不多,相差的只是数据移动时间),可见对数据的有序性不敏感。它虽然比较次数多,但它的数据交换量却很少。所以我们将发现它在一般情况下将快于冒泡排序。

<2>直接插入排序(Insertion Sort):简单的插入排序,每次比较后最多移掉一个逆序,因此与冒泡排序的效率相同。但它在速度上还是要高点,这是因为在冒泡排序下是进行值交换,而在插入排序下是值移动,所以直接插入排序将要优于冒泡排序。直接插入法也是一种对数据的有序性非常敏感的一种算法。在有序情况下只需要经过n-1次比较,在最坏情况下,将需要n(n-1)/2次比较。

<3>冒泡排序(Bubble Sort):将相邻的两个数据元素按关键字进行比较,如果反序,则交换。对于一个待排序的数据元素序列,经一趟排序后最大值数据元素移到最大位置,其它值较大的数据元素向也最终位置移动,此过程为一次起泡。然后对下面的记录重复上述过程直到过程中没有交换为止,则已完成对记录的排序。

<4>快速排序(Quick Sort):是冒泡排序的改进,它通过一次交换能消除多个逆序,这样可以减少逆序时所消耗的扫描和数据交换次数。在最优情况下,它的排序时间复杂度为O(nlog2n)。即每次划分序列时,能均匀分成两个子串。但最差情况下它的时间复杂度将是O(n^2)。即每次划分子串时,一串为空,另一串为m-1(程序中的100K正序和逆序就正是这样,如果程序中采用每次取序列中部数据作为划分点,那将在正序和逆时达到最优)。从100K中正序的结果上看“快速排序”会比“冒泡排序”更慢,这主要是“冒泡排序”中采用了提前结束排序的方法。有的书上这解释“快速排序”,在理论上讲,如果每次能均匀划分序列,它将是最快的排序算法,因此称它作快速排序。虽然很难均匀划分序列,但就平均性能而言,它仍是基于关键字比较的内部排序算法中速度最快者。

<5>希尔排序(Shell Sort):增量的选择将影响希尔排序的效率。但是无论怎样选择增量,最后一定要使增量为1,进行一次直接插入排序。但它相对于直接插入排序,由于在子表中每进行一次比较,就可能移去整个经性表中的多个逆序,从而改善了整个排序性能。希尔排序算是一种基于插入排序的算法,所以对数据有序敏感。

<6>归并排序(Merge Sort):归并排序是一种非就地排序,将需要与待排序序列一样多的辅助空间。在使用它对两个己有序的序列归并,将有无比的优势。其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlog2n)。对数据的有序性不敏感。若数据节点数据量大,那将不适合。但可改造成索引操作,效果将非常出色。

三、排序方法的选择

因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法很重要

(1)若n较小,可采用直接插入或直接选择排序。

当记录规模较小时,直接插入排序较好,它会比选择更少的比较次数;

但当记录规模较大时,因为直接选择移动的记录数少于直接插人,所以宜用选直接选择排序。

这两种都是稳定排序算法。

(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜(这里的随机是指基准取值的随机,原因见上的快速排序分析);这里快速排序算法将不稳定。

(3)若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。

快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;

堆排序虽不会出现快速排序可能出现的最坏情况。但它需要建堆的过程。这两种排序都是不稳定的。

归并排序是稳定的排序算法,但它有一定数量的数据移动,所以我们可能过与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。

(4)特殊的箱排序、基数排序

它们都是一种稳定的排序算法,但有一定的局限性:

1>关键字可分解。

2>记录的关键字位数较少,如果密集更好

3>如果是数字时,最好是无符号的,否则将增加相应的映射复杂度,可先将其正负分开排序。

时间: 2025-01-20 08:25:19

[AS功能代码教程10] 数据结构排序算法的相关文章

数据结构——排序算法总结

  排序(Sorting)就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索而服务的,它是数据处理中一种很重要也很常用的运算.例如我们日常学习中的查字典或者书籍的目录,这些都事先为我们排好序,因此大大降低了我们的检索时间,提高工作效率.   排序可分为两大类:   内部排序(Internal Sorting):待排序的记录全部存放在计算机内存中进行的排序过程:   外部排序(External Sorting):待排序的记录数量很大,内存不能存储全部记录,需要对外存进行访问的排序过程.

[AS功能代码教程09] 点阵字效果

第一次在fanflash上看到这个实例,感觉很不可思议 仔细研究一下发现,作者的构思还是很巧妙的,今天拿来与大家分享一下 这个实例可以说结合了BitmapData类的技术与Tween类的动感. 思路: 1.用AS创建一个空文本框,存储欲显示的字; 2.把这个文本框看成一个位图,并存储其位图数据; 3.逐行扫描这个位图数据,把有文字信息的像素点都存储到数组中; 4.最后根据数组复制出"点",并使每个"点"移动到相应的位置. 步骤1: 绘制10*10的圆点,保存为影片剪

[AS功能代码教程07] 百变图

思路:1.createEmptyMovieClip(MC),位于舞台中央,使之不断旋转; 2.用MC作载体,复制出num(150)个(p0~p149)影片,全部都依附于MC上; 3.AS中共有2个函数(function),分别为Change()和getShape(): Change():首先,获得一个随机图形编号(shape),然后为所有MC["p"+i]点设置大小及透明度,再调用getShape()获得该点的目标坐标; getShape():根据shape编号,返回组成该图形的目标坐

[AS功能代码教程04] 进阶三角函数

在AS 03教程中,我们介绍了关于三角函数基础应用 现在为上次课的内容加以补充和发展 复习一下画圆的方法:x坐标cos(n),y坐标sin(n); n 从0-360的弧度 一.绘制椭圆 对比一下,我们只是把画圆方法中 R ,一分为二. 分成了 W 和 H 分别控制椭圆的宽和高. _root.createEmptyMovieClip("MC", 1); MC._x = 200; MC._y = 200; //创建一个空影片剪辑,放在舞台中央作为画线容器 var W = 50; var H

AS功能代码教程:鱼眼放大镜

下面我们先用图解法来解释一下本实例 思路: 1.鱼眼放大镜是于若干个渐小的圆组成的: 2.使每个圆都去遮罩一个渐大的图片来实现,里面的小圆遮罩大较图片,外面的大圆遮罩较小图片: 3.还有最后一个重要的步骤是"对焦",由于图片是渐大的,所以鼠标所在的一个点位对于小图来说也许是头部,而对于大图来说也许都到了场外,那么显示出的效果就错了.使用"对焦"可以让鼠标指在小图上是头部,大图上也要是头部,这么说给大家一个印象,下面请看图解.   1.首先在舞台上放入两个影片剪辑,其

AS 功能代码教程

两点间距离 Math.sqrt(Math.pow((p1._x-p2._x),2)+Math.pow((p1._y-p2._y),2)) 由这个公式可以推导出某点与原点距离公式: 因为原点坐标为(0,0),所以公式变形如下 Math.sqrt(p1._x * p1._x + p1._y * p1._y) 下面我们就来运用这两个公式来制作一些效果 实例一: 旋转指针 思路: 求一个夹角的θ方法很多如: distance.jpg 正弦函数 sinθ=y/r 余弦函数 cosθ=x/r 正切函数 ta

AS 功能代码教程14] 鱼眼放大镜

本节加了星号,借黑羽的话:"本节的内容稍微有些难度,如果不明白,可以暂时不看,待日后碰到类似问题时,再来查阅" 下面我们先用图解法来解释一下本实例 思路: 1.鱼眼放大镜是于若干个渐小的圆组成的; 2.使每个圆都去遮罩一个渐大的图片来实现,里面的小圆遮罩大较图片,外面的大圆遮罩较小图片; 3.还有最后一个重要的步骤是"对焦",由于图片是渐大的,所以鼠标所在的一个点位对于小图来说也许是头部,而对于大图来说也许都到了场外,那么显示出的效果就错了.使用"对焦&q

[AS功能代码教程14] 鱼眼放大镜

本节加了星号,借黑羽的话:"本节的内容稍微有些难度,如果不明白,可以暂时不看,待日后碰到类似问题时,再来查阅" 下面我们先用图解法来解释一下本实例 思路: 1.鱼眼放大镜是于若干个渐小的圆组成的; 2.使每个圆都去遮罩一个渐大的图片来实现,里面的小圆遮罩大较图片,外面的大圆遮罩较小图片; 3.还有最后一个重要的步骤是"对焦",由于图片是渐大的,所以鼠标所在的一个点位对于小图来说也许是头部,而对于大图来说也许都到了场外,那么显示出的效果就错了.使用"对焦&q

[AS功能代码教程13] 贪吃蛇

思路: 1.首先规定蛇的运动区域宽度(stagew)和高度(stageh) 2.增加键盘侦听,获得键控代码,如果该键与前一个键是反向的则不予改变 3.初始化中, 请注意:蛇头.蛇身.食物的大小均为 7 象素 4.每一次移动的步长(Move)均为8象素,以实现身体为一格一格的效果 5.吃到食物后,蛇身(body)长度增加5个单位,复制出5个身体 6.履带式前进:从尾部开始,后一个跟随前一个的位置,最前面的跟随蛇头 图示: 1.整体思路 2.蛇头.蛇身.食物的大小均为 7 象素,步长 8 象素