查找
基于比较的查找
最快O(logN):折半查找、平衡二叉树、红黑树……
但
Hash表却有O(c)先性级别的效率,特殊情况下达到O(1)
排序
比较排序
最快O(nlogn),其中快排最好,但主元选不好会极大降低性能
快排是原址的,且不开辟辅助空间
堆排序,是原址的,但慢,但可以用于海量数据
时间复杂度
O(n^2)
冒泡排序
效率低
插入排序
效率低,但当序列基本有序的时候,有奇效
选择排序
效率低,但经常用它内部循环的方式找max和min
O(n^1.3)
希尔排序
缩小增量排序,是插入排序的改良
O(nlogn)
快速排序
常用,核心:partition,时间复杂度是一个范围,快慢取决于问题
归并排序
常用,核心:合并,用空间换时间,稳定,无论什么问题,时间复杂度都是O(nlgn)
堆排序
不常用,比快排和归并慢,因为时间复杂度带常数因子,且较大
O(log n)
二分查找,javaAPI里有,直接调用
Arrays.binarySearch(s1,a);
非比较排序
在特定情况下可以做到绝对比比较排序快
计数排序
O(n + k) , k = getMax(arr)
最快,适用范围:元素分布相对集中,已知边界,且边界较小
桶排序
O(n + c) ,c = n * (logn - logm)
适用范围;元素分布较均匀,越均匀c越小,极其不均匀已致所有元素都在一个桶,时间复杂度将变成O(nlgn)
基数排序
O(n)
整数行排序里又稳又快,不受问题影响,开辟固定空间
对于十进制整数来说,基数排序最常用
javaAPI封装的排序
Arrays.sort(快排+插入) 时间复杂度取决于它排序的数据类型和数组的大小。
是基于比较、会改变数组内容
想利用排序后的结果的用这个