排序是数据结构的一种重要运算。
1、基本概念
在讨论排序的概念之前,首先引入排序码的概念。所谓排序码是结点中的一个或多个字段,其值作为排序运算中的依据。排序码可以是关键字,这时排序即按关键字对文件进行排序;排序码也可以不是关键字,这时可能有多个结点的排序码具有相同的值,因而排序结果就可能不唯一。排序码的数据类型可以是整数,也可以是实数、字符串,乃至复杂的组合数据类型。
习惯上,在排序中将结点称为记录,将一系列结点构成的线性表称为文件。在本书中后续涉及排序时,都要使用记录和文件这两个概念,请读者将它们和外存中的记录、文件等概念加以区别。
排序又称分类。假定具有n个记录{A1,A2,...,An}的文件,每个记录有一个排序码Ki,{K1,K2,...,Kn}是有相应的排序码的集合。排序运算就是将上述文件中的记录按排序码非递减(或非递增)的次序排列成有序序列。
由于各种待排序的文件中,记录的大小和数量不等,有的文件的记录本身较大、数量很多,有的文件的记录本身较小、数量较少。对于较小的文件,可以一次将文件全部调入内存进行排序处理;而对于很大的文件,无法一次全部调入内存进行排序处理,因而在排序过程中需要涉及内外存之间的数据交换。在排序过程中,文件全部放在内存处理的排序算法称为“内部排序”;在排序过程中,不仅需要使用内存,而且还要使用外存的排序算法称为“外部排序”。
按照所采用的策略不同,可以分为六种类型,即插入排序、选择排序。交换排序、分配排序、归并排序和外部排序。当然,由于关注的重点不同,一个具体的排序算法采用的策略既可以看成是这种,也可以看成是那种,也就是说,一个具体的排序算法究竟该属于上述六种类型中的哪一种并不是唯一的。
在待排序的文件中,可能存在着多个具有相同排序码的记录。如果一个排序算法对于任意具有相同排序码的多个记录在排序之后,这些具有相同排序码的记录的相对次序仍然保持不变,则称该排序算法是“稳定的”;否则称该排序算法是“不稳定的”。
排序的方法很多,就其性能而言,很难说哪一种算法是最好的。每一种算法都有各自的优缺点,适合不同的应用领域。有两个评价排序算法性能的重要指标,一个是算法执行时所需时间,另一个是算法执行时所需内存空间。其中,时间开销是衡量一个排序算法好坏最重要的性能指标。为便于分析,排序算法的时间开销通常用算法执行中的比较次数和记录移动次数来表示。许多排序算法执行排序时所耗费的时间不仅与算法本身有关,而且与待排序文件的记录顺序有关,衡量这些排序算法的性能可以采用最大执行时间和平均执行时间。
2、插入排序
////直接插入排序
////折半插入排序
////Shell排序
3、选择排序
////直接选择排序
////树形选择排序
4、交换排序
////冒泡排序
////快速排序
5、分配排序
6、归并排序
7、外部排序
8、排序算法的时间下界