排序基本概念
假设有 n个记录的序列为{r1, r2, …, rn},其相应的关键字分别{{k1, k2, …, kn},需确定 1,2,…,n 的一种排序 p1, p2, …, pn ,使其相应的关键字满足kp1 <= kp2 <= … <= kpn 非递减(或非递增)关系,即 使得序列成为一个按关键字有序的序列{rp1, rp2, …, rpn},这样的操作就称为序列.
简单来说:就是将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序.
在排序问题中,通常将数据元素称为记录。
排序方法的分类
按数据存储介质
内部排序:数据量不大,数据在内存,无需内外存交换数据
外部排序:数据量较大,数据在外存
内部排序分为:
• 插入排序:直接插入排序,折半插入排序,希尔排序
• 交换排序:冒泡排序,快速排序
• 选择排序:简单选择排序,堆排序
• 归并排序:2-路归并排序
• 基数排序
按比较器个数
串行排序:单处理机(同一时刻比较一对元素)
并行排序:多处理机(同一时刻比较多对元素)
按主要操作
比较排序: 插入排序, 交换排序,选择排序,归并排序
*归并排序:不比较元素大小,仅仅根据元素本身的取值确定其有序位置
按辅助空间
原地排序:辅助空间用量为O(1)的排序方法(所占的辅助存储空间与参加排序的数据量大小无关)
非原地排序:辅助空间用量超过O(1)的排序方法
按稳定性
稳定排序:能够使任何数值相等的元素,排序后相对次序不变
非稳定排序:非稳定排序方法
例:5, 4,3,2,1,5*
排序后
如果为:1,2,3,4,5,5*
则为稳定排序
如果为:1,2,3,4,5*,5
则为非稳定排序
按自然性
自然排序:输入数据元素越有序,排序速度越快的排序方法
非自然排序:不是自然排序的方法
各种排序方法的综合比较
1.时间性能
2.空间性能
注:在下图链式基数排序中,关键码的取值范围为rd
3.稳定性能
注:希尔排序时间复杂度跟增量公式有关,大约来说
希尔排序 | 最好情况 | 最坏情况 | 平均情况 |
---|---|---|---|
- | n1.3 | n2 | nlogn~n2 |
补充:
从算法简单性来看:
简单算法:冒泡,简单选择,直接插入
改进算法:希尔,堆,归并,快速
从待排序记录个数来看:
排序记录个数越小,采用简单算法越合适
排序记录个数越大,采用改进算法越合适
从最好情况来看:
冒泡和直接插入更好一点,另4种改进算法反而慢
对于快速排序,如果待排序序列为正序或逆序,那么为最坏情况,一般不用快速排序
排序-插入排序-直接插入,折半插入,希尔排序(C语言)
排序-交换排序-冒泡排序,快速排序,改进快速排序(C语言)
排序- 选择排序-简单选择排序,堆排序(C语言)
排序-归并排序(递归,非递归)(C语言)