排序
排序是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合或序列重新排列成一个按数据元素某个数据项值有序的序列。
排序码(关键码):排序依据的数据项。
稳定排序:排序前与排序后相同关键码元素间的位置关系,保持一致的排序方法。
不稳定排序:排序前与排序后相同关键码元素间的相对位置发生改变的排序方法。
排序分为两类:
内排序:指待排序列完全存放在内存中所进行的排序。
内排序大致可分为五类:插入排序、交换排序、选择排序、归并排序和分配排序。外排序:指排序过程中还需访问外存储器的排序。
为了以后讨论方便,我们直接将排序码写成一个一维数组的形式,并且在没有
声明的情形下,所有排序都按排序码的值递增排列。
各种内部排序方法性能比较
排序算法 | 平均时间性能 | 最好时间性能 | 最坏时间性能 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
插入排序 | 稳定 | ||||
Shell排序 | 不稳定 | ||||
冒泡排序 | 稳定 | ||||
快速排序 | 不稳定 | ||||
简单选择排序 | 不稳定 | ||||
堆排序 | 不稳定 | ||||
归并排序 | 稳定 | ||||
基数排序 | 稳定 |
- 从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。
- 从算法简单性看:由于简单选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法,都包含在上图中的“简单排序”中。对于希尔排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。
- 从稳定性看:直接插入排序、冒泡排序和归并排序是稳定的;而希尔排序、简单选择排序、快速排序和堆排序是不稳定排序。
- 从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采用改进排序。
选择排序的方法
- 当待排序记录数n 较大时,若要求排序稳定,则采用归并排序。
- 当待排序记录数n 较大,关键字分布随机,而且不要求稳定时,可采用快速排序;
- 当待排序记录数n 较大,关键字会出现正、逆序情形,可采用堆排序(或归并排序)。
- 当待排序记录数n 较小,记录已接近有序或随机分布时,又要求排序稳定,可采用直接插入排序。
- 当待排序记录数n 较小,且对稳定性不作要求时,可采用简单选择排序。