程序员面试宝典-排序

程序员面试宝典-排序


排序

什么是排序?

所谓排序, 就是整理文件中的记录, 使之按关键字递增( 或递减) 的顺序排列起来。 其
确切定义如下:
输入: n个记录R1、 R2、 …、 Rn, 其相应的关键字分别为K1、 K2、 …、 Kn。
输出: Ril、 Ri2、 …、 Rin, 使得Ki1≤Ki2≤…≤Kin( 或Ki1≥Ki2≥…≥Kin) 。

被排序对象——文件

被排序的对象——文件由一组记录组成。
记录则由若干个数据项( 或域) 组成。 其中有一项可用来标识一个记录, 称为关键字项。
该数据项的值称为关键字( Key) 。

排序运算的依据——关键字

用来做排序运算依据的关键字, 可以是数字类型, 也可以是字符类型。
关键字的选取应根据问题的要求而定。
在高考成绩统计中将每个考生作为一个记录。 每条记录包含准考证号、 姓名、 各科的分
数和总分数等项内容。 若要唯一地标识一个考生的记录, 则必须用“准考证号”作为关键字。
若要按照考生的总分数排名次, 则需用“总分数”作为关键字。

排序的稳定性

在待排序的文件中, 若存在多个关键字相同的记录, 经过排序后这些具有相同关键字的
记录之间的相对次序保持不变, 该排序方法是稳定的; 若具有相同关键字的记录之间的相对
次序发生变化, 则称这种排序方法是不稳定的。
稳定的排序如下表所示。
这里写图片描述
这里写图片描述

排序分类

按是否涉及数据的内、 外存交换分

在排序过程中,若整个文件都是放在内存中处理, 排序时不涉及数据的内、外存交换,则称为内部排序(简称内排序)
反之, 若排序过程中要进行数据的内、 外存交换, 则称为外部排序。

内排序适用于记录个数不很多的小文件。
外排序则适用于记录个数太多, 不能一次将其全部记录放入内存的大文件。

按策略划分内部排序方法

可以分为5类: 插入排序、 选择排序、 交换排序、 归并排序和分配排序。

排序算法的基本操作

大多数排序算法都有两个基本的操作:
● 比较两个关键字的大小。
● 改变指向记录的指针或移动记录本身
注意: 第二种基本操作的实现依赖于待排序记录的存储方式

待排文件的常用存储方式

1) 以顺序表( 或直接用向量) 作为存储结构
排序过程: 对记录本身进行物理重排, 即通过关键字之间的比较判定, 将记录移到合适的位置。

2) 以链表作为存储结构
排序过程: 无须移动记录, 仅需修改指针。 通常将这类排序称为链表( 或链式) 排序。

3) 用顺序的方式存储待排序的记录, 但同时建立一个辅助表( 如包括关键字和指向记录位置的指针组成的索引表)

排序过程: 只需对辅助表的表目进行物理重排( 即只移动辅助表的表目, 而不移动记录本身) 。
适用于难于在链表上实现, 且仍需避免排序过程中移动记录的排序方法。

排序算法性能评价

1) 评价排序算法好坏的标准
评价排序算法好坏的标准主要有两条:
● 执行时间和所需的辅助空间。
● 算法本身的复杂程度。

2) 排序算法的空间复杂度
若排序算法所需的辅助空间并不依赖于问题的规模n, 即辅助空间是O(1), 则称为就地排序( In-PlaceSort) 。
非就地排序一般要求的辅助空间为O(n)。

3) 排序算法的时间开销 大多数排序算法的时间开销主要是关键字之间的比较和记录的移动。 有的排序算法其执行时间不仅依赖于问题的规模, 还取决于输入实例中数据的状态。