数据结构——排序

1、基本概念
排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列。
a、稳定排序和非稳定排序
设文件f=(R1……Ri……Rj……Rn)中记录Ri、Rj(i≠j,i、j=1……n)的key相等,即Ki=Kj。若在排序前Ri领先于Rj,排序后Ri仍领先于Rj,则称这种排序是稳定的,其含义是它没有破坏原本已有序的次序。反之,若排序后Ri与Rj的次序有可能颠倒,则这种排序是非稳定的,即它有可能破坏了原本已有序记录的次序
b、内排序和外排序
若待排文件f在计算机的内存储器中,且排序过程也在内存中进行,称这种排序为内排序。内排序速度快,但由于内存容量一般很小,文件的长度(记录个数)n受到一定限制。若排序中的文件存入外存储器,排序过程借助于内外存数据交换(或归并)来完成,则称这种排序为外排序。我们重点讨论内排序的一些方法、算法以及时间复杂度的分析。

2、排序方法分类
各种内排序方法可归纳为以下五类:插入排序、交换排序、选择排序、归并排序、基数排序。

3、直接插入排序算法的分析及实现
排序方法:
先将文件中的(R1)看成只含一个记录的有序子文件,然后从R2起,逐个将R2至Rn按key插入到当前有序子文件中,最后得到一个有序的文件。插入的过程上是一个key的比较过程,即每插入一个记录时,将其key与当前有序子表中的key进行比较,找到待插入记录的位置后,将其插入即可。另外,假定排序后的文件按递增次序排列(以下同)。

4、Shell排序算法的分析及实现
排序方法:
Shell(希尔)排序又称“缩小增量”排序,1959年由D.L.Shell提出。希尔发现:直接插入排序中,key比较次数及记录移动次数会比较大,若将待排序文件按某种次序分隔成若干个子文件,对各子文件“跳跃”式的排序,然后调整子文件个数,逐步对原文件排序,这样总的key比较次数尤其是记录移动次数也许会大大降低。
设待排文件f=(R1 R2……Rn),先将f中相隔增量d(如令d=n/2)的记录组成一个个子文件,对各子文件插入排序;然后缩小增量d(如令d=d/2),再将相隔新增量的记录组成一个个子文件,对诸子文件排序,……,直到增量d=1为止,排序完毕。这是一种跳跃式的排序方法,它使得文件逐步有序,从而克服了一次排序时记录成片移动现象。

5、冒泡排序算法的分析及实现
排序方法:
a、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
b、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
c、针对所有的元素重复以上的步骤,除了最后一个。
d、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

6、冒泡排序算法的分析及实现
排序方法:
经过key的一趟比较后,确定某个记录在排序后的最终位置。
a、设待排文件的key集合k={k1 k2……ki……kj……kn-1 kn},对k中的k1,称作枢轴(Pirot)或基准。
b、逆序比较:k1~kn,若k1≤kn,则k1不可能在kn位置,k1~kn-1,……直到有个kj,使得k1>kj,则k1有可能落在kj位置,将kj->k1位置,即key比基准(k1)小的记录向左移。
c、正序比较:k1~k2,若k1>k2,则k1不可能在k2位置,k1~k3,……直到有个ki,使得k1<ki,则k1有可能落在ki位置,将ki->kj位置(原kj已送走),即key比基准大的记录向右移。
d、反复逆序、正序比较,当i=j时,i位置就是基准k1的最终落脚点(因为比基准小的key统统在其“左部”,比基准大的统统在其“右部”,作为基准的key自然落在排序后的最终位置上),并且k1将原文件分成了两部分:对k’和k”,套用上述排序过程(可递归),直到每个子表只含有一项时,排序完毕。

posted on 2019-03-19 21:57  三无蛮子  阅读(278)  评论(0编辑  收藏  举报

导航