Pages

Monday, May 16, 2011

排序算法(Sorting)

排序算法(Sorting)
作者:未知    文章来源:算法与数据结构    

排序问题的输入是一个线性表,该线性表的元素属于一个偏序集;要求对该线性表的元素做某种重排,使得线性表中除表尾外的每个元素都小于等于(或大于等于)它的后继。

设R为非空集合A上的二元关系,如果R满足自反性(对于每一个x∈A,(x,x)∈R),反对称性((x,y)∈R∧(y,x)∈R→x=y)和传递性((x,y)∈R∧(y,x)∈R→(x,z)∈R),则称R为A上的偏序关系,记作≤。如果(x,y)∈R,则记作x≤y,读作“x小于等于y”。存在偏序关系的集合A称为偏序集

注意,这里的≤不是指数的大小,而是指在偏序关系中的顺序性。x≤y的含义是:按照这个序,x排在y前面。根据不同的偏序定义,≤有不同的解释。例如整 除关系是偏序关系≤,3≤6的含义是3整除6。大于或等于关系也是偏序关系,针对这个关系5≤4是指在大于或等于关系中5排在4的前面,也就是说5比4 大。

在实际应用中,经常遇到的偏序关系是定义在一个记录类型的数据集合上的。在该记录类型中有一个主键域key,key域的类型是某一个偏序集,记录的其他域称为卫星数据。比较线性表中的两个元素Li和Lj的大小,实际上是比较Li.key和Lj.key的大小(这种比较当然也是偏序集中的比较)。

举例而言,某公司的数据库里记录了员工的数据,每一项纪录包括姓名,编号,年龄,工资等几个域,如果以编号为key域对员工记录排序,则是将员工记录按 照编号排序;如果以工资为key域对员工记录排序,则是将员工记录按照工资高低排序;如果以姓名为key域对员工记录排序,则是以员工姓名的汉语拼音按照 字典顺序排序。

关于偏序集的具体概念和应用,请参见离散数学的相关资料。

如果一个排序算法利用输入的线性表在原地重排其中元素,而没有额外的内存开销,这种排序算法叫做原地置换排序算法(in place sort);如果排序后并不改变表中相同的元素原来的相对位置,那么这种排序算法叫做稳定排序算法(stable sort)。

排序问题一般分为内排序(internal sorting)和外排序(external sorting)两类:

1. 内排序:待排序的表中记录个数较少,整个排序过程中所有的记录都可以保留在内存中;
2. 外排序:待排序的记录个数足够多,以至于他们必须存储在磁带、磁盘上组成外部文件,排序过程中需要多次访问外存。

No comments:

Post a Comment