排序算法基本思想
内部排序:全部待排序记录都可以同时调入内存进行的排序。
外部排序:待排序记录的数量太大,以致无法将其同时调入内存,尚需访问外存的排序过程。
排序中的基本操作:
1. 比较关键字大小 (对大多数排序算法是必须的)
2. 移动记录 (可通过改变记录的存储方式避免)
待排序记录的存储方式:
1. 存储在地址连续的一组存储单元中,记录之间的次序由存储位置决定,排序必须移动记录;
2. 存在静态链表中,记录之间的次序关系由指针指示,排序不同移动记录,仅需修改指针;(链表排序)
3. 待排序记录本身存储在一组地址连续的存储单元内,同时附设一个指示记录存储位置的地址向量,排序过程中不移动记录,而移动指向向量中这些记录的地址,在排序结束后,再按照地址向量中的值调整记录的存储位置。(地址排序)
内部排序算法按依据的原则不同分类:
插入排序、交换排序、归并排序、选择排序、基数排序
排序算法的评价标准:
1. 时间开销 (最重要的开销,可以用比较和移动次数衡量)
2. 附加空间
排序方法 | 平均时间复杂度 | 最好情况时间复杂度 | 最坏情况时间复杂度 | 空间复杂度 | 稳定性 | |
插入排序 | 直接插入 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
折半插入 | O(n2) | O(1) | 稳定 | |||
希尔排序 | O(n1.3) | O(1) | 不稳定 | |||
交换排序 | 冒泡排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
快速排序 | O(nlogn) | O(n2) | O(logn) | 不稳定 | ||
选择排序 | 简单选择排序 | O(n2) | O(1) | 稳定 | ||
堆排序 | O(nlogn) | O(1) | 不稳定 | |||
归并排序 | 2-路归并 | O(nlogn) | O(n) | 稳定 |
基数排序是稳定的内排方法,所有时间复杂度为O(N2)的简单排序算法也是稳定的,而快排、堆排序和希尔排序等时间性能较好的排序算法是不稳定的。堆排序是一种不稳定的排序算法。