查找,排序的算法很多,性能这块是真的老会懵,干脆总结一下,不太全,可能慢慢还会补充,有错误或者有补充欢迎指出啊~
名称 | 时间复杂度 | 平均查找长度 | 适用存储方式 | 比较次数(最坏) |
顺序查找 | o(n) | (n+1)/2 | 顺序/链式 | n |
二分查找 | o(logn) | log(n+1)-1(最小) | 顺序 | log(n+1) |
分块/索引查找 | o(logn)~o(n) | (n/s+s)/2+1(s表示每块的元素个数) | 顺序/链式 | |
哈希查找 | o(1) | |||
二叉查找树 | 最好(平衡二叉树)o(logn) 最坏(只有左/右子树)o(n) | 最好(平衡二叉树)log(n+1)-1 最坏(只有左/右子树)(n+1)/2 | 动态查找表 | |
红黑树 | o(logn) | |||
AVL树 | o(logn) |
注:红黑树和AVL都属于平衡二叉树,以及我真的看不懂这俩。。。
名称 | 最好时间复杂度 | 平均时间复杂度 | 最坏时间复杂度 | 辅助空间 | 是否稳定 |
直接插入 | o(n) | o(n^2) | o(n^2) | o(1) | 是 |
二分插入 | o(n) | o(n^2) | o(n^2) | o(1) | 是 |
冒泡 | o(n) | o(n^2) | o(n^2) | o(1) | 是 |
归并 | o(nlogn) | o(nlogn) | o(nlogn) | o(n) | 是 |
基数 | o(d(rd+n)) | o(d(rd+n)) | o(d(rd+n)) | o(rd+n) | 是 |
希尔 | o(n^1.25) | o(1) | 否 | ||
快速 | o(nlogn) | o(nlogn) | o(n^2) | o(logn) | 否 |
直接选择 | o(n^2) | o(n^2) | o(n^2) | o(1) | 否 |
堆排序 | o(nlogn) | o(nlogn) | o(nlogn) | o(1) | 否 |
注:归并排序需要开辟额外空间
计数排序:非基于比较的排序(基于统计),时间复杂度o(n+k),空间复杂度为o(k),k为数据范围