时间和空间复杂度
整理:
排序 | 稳定性 | 时间复杂度 | 空间度复杂度 | ||
---|---|---|---|---|---|
最好 | 最坏 | 最好/平均/最坏 | 最好/平均/最坏 | ||
冒泡排序 | 有序 | 逆序 | 稳定 | O(n) / O(n2) / O(n2) | O(1) |
插入排序 | 有序 | 逆序 | 稳定 | O(n) / O(n2) / O(n2) | O(1) |
选择排序 | 不稳定 | O(n2) / O(n2) / O(n2) | O(1) | ||
希尔排序 | 不稳定 | O(n * log(n)) / O(n * log(n)) / O(n*log(n)) | O(1) | ||
堆排序 | 不稳定 | O(n * log(n)) / O(n * log(n)) / O(n * log(n)) | O(1) | ||
快速排序 | 完全二叉树 | 单支树 | 不稳定 | O(n * log(n)) / O(n * log(n)) / O(n2) | O(log(n)~O(n) |
归并排序 | 稳定 | O(n * log(n)) / O(n * log(n)) / O(n*log(n)) | O(n) |
快速排序的优化
- 基准值的选择方法
三数取中
随机选择
双基准值 - 进行partition的过程中,将基准值归拢在一起
- 递归->非递归
- 数据量较小时,使用插排代替
海量数据排序问题:
关于海量数据做排序——这是一个外部排序(需要用到非内存的存储,例如:硬盘)
- 将文件平均分割,保证每个小文件的大小足够进行内部排序(内存放得下)
- 分别针对每个小文件进行独立的排序:m个有序的小文件(数组)
- 进行多路归并——合并多个有序数组变成一个有序数组。