排序算法
分类 | 操作元素 | 排序思想(从小到大) | 时间复杂度 | 空间复杂度 | 算法稳定性 | 对比次数(min) | 对比次数(max) | 移动次数(min) | 移动次数(max) | 适用条件 | 优化 |
---|---|---|---|---|---|---|---|---|---|---|---|
直接插入 | 未排序字段的第一个元素 | 插入已排序字段的位置 | O(n^2) | O(1) | √ | (n-1)*(3n-4)/2 | n | 希尔排序/二分插入 | |||
二分插入 | 未排序字段的第一个元素 | 二分查找已排序字段的位置 | O(n*log2(n)) | O(1) | n | ||||||
希尔排序 | 元素与其增量元素(趟数↑增量元素↓) | 组内使用插入/选择排序 | O(logm(n)) | O(n) | × | × | |||||
冒泡排序 | 相邻元素 | 交换位置使最小元素到已排序字段 | O(n^2) | O(1) | √ | n-1(已有序) | (n-1)*(3n-4)/2 | 0 | (n-1)*(3n-4)/2 | 数组已基本有序 | |
简单选择 | 未排序段的最小值 | 加入已排序段末尾 | O(n^2) | O(1) | √ | (n-1)*(3n-4)/2 | (n-1)*(3n-4)/2 | 0 | (n-1)*(3n-4)/2 | 堆排序 | |
堆排序 | 未排序段的根 | 加入已排序段末尾 | O(log n) | O(n) | × | (n-1)+n*logm(n) | 同左 | ||||
归并排序(内部) | 分组元素 (分组↓分组元素↑) | 分组元素内部简单选择排序 | O(logm(n)) | O(n) | √ | n-1 | 同左 | 0 | (n/2)*logn(n) | ||
基数排序 | 元素部位 | 元素部位权值(从小到大)排序 | O(mn) | O(n) | × | mnlog2(n) | m*… | 0 | m* | 数量巨大 | |
归并排序(外部) | 硬盘读取进内存的片段元素 | 归并排序 | (m-1)*n | (m-1)*n | n | n | 外部排序 | 归并路数+败者树↑ &归并段数↓(置换-选择排序+最佳归并树) | |||
败者树 | 树根元素 | 取出加入树尾 | O(log n) | O(n) | × | (n-1)+n*logm(n) | 同左 | ||||
置换-选择排序 | 已加入内存的元素 | 加入工作区,工作区选取最小元素成归并段;工作区满则建立新归并段 | O(n-1) | O(n) | √ | n-1 | 同左 | n | n |
最小生成树算法
算法 | 算法思想 | 适用条件 |
---|---|---|
dijkstra算法 | 每次选取连通距离起点最近的未到达顶点直到到达终点 | 单源无负权最短路径 |