1,排序的一般定义:
1,排序是计算机内经常进行的一种操作,其目的是将一组“无序”的数据元素调整为“有序”的数据元素;
2,无序到有序就是排序;
2,排序的数学定义:
1,假设含 n 个数据元素序列为{R1, R2, ..., Rn}, 其相应的关键字序列为 {K1, K2, ..., Kn},这些关键字相互之间可以进行比较,即:在它们之间存在着这样一个关系 Kp1 <= Kp2 <= ... <= Kpn, 按此固有关系将上式记录序列重新排列为 {Rp1, Rp2, ..., Rpn}的操作称为排序。
3,排序的稳定性:
1,如果在序列中有两个数据元素 r[i] 和 r[j],它们的关键字 k[i] == k[j],且在排序之前,对象 r[i] 排在 r[j] 前面;如果在排序之后,对象 r[i] 仍在对象 r[j] 的前面,则称这个排序方法是稳定的,否则称这个排序方法是不稳定的;
4,多关键字排序:
1,排序时需要比较的关键字多于一个:
1,排序结果首先按关键字 1 进行排序;
2,当关键字 1 相同时按关键字 2 进行排序;
3,当关键字 n - 1 相同时按关键字 n 进行排序;
(4),关键字之间有优先级;
5,多关键字排序是否比单关键字排序更复杂?
1,对于多关键字排序,只需要在比较操作时同时考虑多个关键字即可;
2,只要定义好了大小关系,就排序算法而言,多关键字排序和单关键字排序本质没有任何差异;
3,后续课程只考虑单关键字排序;
6,多关键字比较的代码实现:
1,利用短路原则;
7,排序中的关键操作:
1,比较:
1,任意两个数据元素通过比较操作确定先后次序;
2,交换:
1,数据元素之间需要交换才能得到预期效果(无序变有序);
8,排序的审判:
1,时间性能:
1,关键性能差异体现在比较和交换的数量;
2,辅助存储空间:
1,为完成排序操作需要的额外的存储空间:
1,嵌入式开发,空间资源受限;
2,必要时可以“空间换时间”;
3,算法的实现复杂性:
1,过于复杂的排序法可能影响可读性和可维护性;
9,DTLib 中的排序类设计:
1,定义排序类,类中实现常用的各种各样排序方法,项目中直接只用类的成员函数就可以排序;
2,排序类继承自 Object;
3,构造函数、拷贝构造函数以及赋值操作符全部定义为私有的,排序类不可能有对象;
4,将不同排序方法实现为类的静态成员函数来使用;
10,小结:
1,排序是数据元素从无序到有序的过程;
2,排序具有稳定性,是选择排序算法的(主要)因素之一;
3,比较和交换是排序的基本操作;
4,多关键字排序与单关键字排序无本质区别;
1,比较没本质区别,所以排序也没本质区别;
5,排序的时间性能是区分排序算法好坏的主要因素;