1、排序的—般定义
排序是计算机内经常进行的—种操作,其目的是将一组“无
序”的数据元素调整为“有序”的数据元素。
例如:将下列关键字序列
52,49,80,36,14,58, 61,23,97, 75
调整为
14,23,36,49,52,58, 61,75,80,97
2、排序的数学定义
假设合n个数据元素的序列为: { R1 R2 , ... , Rn} , 其相
应的关键字序列为: { K1 K2 , ... , Kn } ;
这些关键字相互之间可以进行比较,即:在它们之间存在
着这样—个关系: Kp1 <= Kp2 <=...<= Kpn
按此固有关系将上式记录序列重新排列为:
{ Rp1 Rp2 , ... ,Rpn }
的操作称为 排序。3、排序的示例
4、问题
按总评排序后为什么张无忌的排名比郭靖靠前呢?
5、排序的稳定性
如果在序列中有两个数据元素 r[i] 和 r[j]它们的关键字
k[i]== k[j] 且在排序之前,对象 r[i] 排在 r[j] 前面;如
果在排序之后,对象 r[i] 仍在对象 r[j] 的前面,则称这个
排序方法是稳定的,否则称这个排序方法是不稳定的。
稳定性排序示例
6、多关键字排序
- 排序时需要比较的关键字多余—个
排序结果首先按关键字1进行排序
当关键字1相同时按关键字2进行排序
....
当关键字n-1相同时按关键字n进行排序
多关键字排序示例
7、问题
多关键字排序是否比单关键字排序更复杂?
对于多关键字排序,只需要在比较操
作时同时考虑多个关键字即可!!
8、编程实验
多关键字比较操作
#include <iostream> #include"Object.h" using namespace std; using namespace DTLib; struct Test : public Object { int key1; //high priority int key2; Test(int k1,int k2) { key1 = k1; key2 = k2; } bool operator == (const Test& t) { return (key1 == t.key1) && (key2 == t.key2); } bool operator != (const Test& t) { return !(*this == t); } bool operator < (const Test& t) { return (key1 < t.key1) || ((key1 == t.key1) && (key2 < t.key2)); } bool operator >= (const Test& t) { return !(*this < t); } bool operator > (const Test& t) { return (key1 > t.key1) || ((key1 == t.key1) && (key2 > t.key2)); } bool operator <= (const Test& t) { return !(*this > t); } }; int main() { Test t1(3,4); Test t2(2,5); Test t3(3,4); Test t4(3,5); cout<<(t1 > t2)<<endl; //1 cout<<(t3 < t4)<<endl; //1 return 0; }
9、排序中的关键操作
-比较
任意两个数据元素通过比较操作确定先后次序
-交换
数据元素之间需要交换才能得到预期结果
10、排序的审判
- 时间性能
关键性能差异体现在比较和交换的数量
-辅助存储空间
为完成排序操作需要的额外的存储空间
必要时可以“空间换时间”
-算法的实现复杂性
过于复杂的排序法可能影响可读性和可维护性11、DTLib中的排序类设计
12、编程实验
DTLib中的排序类 class Sort;Sort.h
#ifndef SORT_H #define SORT_H #include"Object.h" namespace DTLib { class Sort : public Object { private: Sort(); Sort(const Sort&); Sort& operator = (const Sort&); template <typename T> static void swap(T& a,T& b) { T t(a); a = b; b = t; } public: }; } #endif // SORT_H
13、小结
排序是数据元素从无序到有序的过程
排序具有稳定性,是选择排序算法的因素之—
比较和交换是排序的基本操作
多关键字排序与单关键字排序无本质区别
排序的时间性能是区分排序算法好坏的主要因素