一、快速排序
此快速排序为基础的快速排序,可改进、优化。
-
基本思想(来自《数据结构》,严蔚敏、吴伟民编著,下同):
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 -
例子:
- 以序列中的第一个数(83)为基准数,使 X=基准数:
- 从后往前依次与 X 比较,找到小于 X 的数(15),并与 X 交换:
- 从前往后依次与 X 比较,找到大于 X 的数(84),并与 X 交换:
- 重复第2步:
- 重复第3步:
- 一直重复到基准数前都是小于基准数的数,基准数后都是大于基准数的数:
至此完成第一次排序,再分别对基准数前、后的序列按照1-6步操作,直到完成排序。
- 算法(伪代码,来自《数据结构》,严蔚敏、吴伟民编著,下同):
#define MAXSIZE 20 //一个用作示例的小顺序表最大长度
typedef int KeyType; //定义关键字类型为整数类型
typedef struct {
KeyType key; //关键字项
InfoType otherinfo; //其他数据项
}RedType; //记录类型
typedef struct {
RedType r[MAXSIZE + 1]; //r[0]闲置或用作哨兵单元
int length; //顺序表长度
}SqList; //顺序表类型
int Partition(SqList &L, int low, int high)
{
// 交换顺序表 L 中子表 r[low.high] 的记录,枢轴记录到位,并返回其所在位置,
// 此时在它之前(后)的记录均不大(小)于它。
L.r[0] = L.r[low]; //用子表的第一个记录作枢轴记录
int pivotkey = L.r[low].key; //枢轴记录关键字
while (low<high) //从表的两端交替地向中间扫描
{
while (low < high&&L.r[high].key >= pivotkey) --high;
L.r[low] = L.r[high]; //将比枢轴记录小的记录移到低端
while (low < high&&L.r[low].key <= pivotkey) ++low;
L.r[high] = L.r[low]; //将比枢轴记录大的记录移到高端
}
L.r[low