插入排序
算法:从第二个开始,按照顺序查到到之前的正确位置。不需要额外的内存空间。
时间复杂度:一次n长度的插入操作要比较n次,所以为n。总和O(n2)O(n^2)O(n2)。(1+2+3+4+5+67+8+9…)
归并排序
算法:将数组不断二分,将小的每部分排好序之后,再进行归并。需要额外的内存空间。
时间复杂度:一次长度为n的归并操作为n。化成树形结构后共有logn层深(每层2分),每层加起来有n操作,总和O(nlogn)O(nlogn)O(nlogn)
(当n大于30时,归并就比插入要快了)
递归树
当问题展开为a部分,每部分规模为b/n的问题,logablog_a^blogab,最后等价于O(logn)
分治法
典例:归并排序、二分法、计算x的n次方、斐波那契数列、快速排序
快速排序
随机选定一个数,将剩下的数据与其进行比较,得到小于数的一部分和大于数的一部分。之后使用递归完成。不需要额外的内存空间,复杂度O(nlogn)O(nlog_n)O(nlogn)。不适用于对于几乎要排好的数据,此时的复杂度和插入排序一样。
随机化快速排序
在挑选主元是随机挑选,这样不受输入数组的影响。受随机的影响而与输入无关。没有一种最差的输入会引起最差的运行效率。在算法优化的情况下要比归并排序快三倍左右,而且占用内存空间小。
计数排序
如果能确定数的范围{0,k},没出现一个数记一次次数,复杂度为O(n+k)O(n+k)O(n+k),k小的时候计算很快