总结各种排序算法,时间复杂度与空间复杂度,优缺点等。
堆排序
堆排序的时间复杂度是 ,堆排序具有空间原址性。
堆是一个数组,可以看成一棵近似的完全二叉树。除了最底层之外,该树完全填满,给定一个节点i,可以很容易地计算其父节点为floor(i/2),左子节点为2i,右子节点为2i+1.
最大堆是指堆中最大元素存在根节点。
建立堆
堆排序:建立最大堆,然后把根元素与最后一个元素交换位置,再把节点n去掉,并使得剩余n-1个节点重新满足最大堆。重复此过程,则将按照从大到小的顺序依次把元素从堆中取出。从而完成排序。
快速排序
快排平均时间复杂度是 ,最坏时间复杂度是 。
但是快排通常是实际应用中最好的选择,原因如下:
- 原址排序
- 平均性能非常好,虽然平均时间复杂度是 ,但是常数因子小得多
快排:在数组中随机找到一个元素,交换数组中其他元素的位置,使得该元素左边的数都比他小,右边的数都比他大。递归调用。
从快排的原理,易知其平均时间复杂度是 ,在最坏的情况下,相当于插入排序,因此时间复杂度是 。
快排的随机化版本
为了增加随机性,使得划分更加均匀,每次随机从数组中挑选一个元素作为划分节点。
线性时间排序
所有基于比较的排序方法的时间复杂度的上界是 。存在其他不适基于比较的排序算法,可以达到线性时间复杂度。
计数排序
假设n个输入元素的每一个都是在0-k之间的一个整数。时间复杂度为 。
计数排序的过程是:对每个输入的元素,都统计比它小的元素的个数。这样就可以直接把它在输出数组的位置上插入。当有几个元素相同时要稍作修改。
基数排序
基数排序是指先按照最低有效位进行排序来解决卡片排序问题。之所以先按照最低有效位排序,是因为高位比低位优先级要高。为了确保基数排序的有效性,一位数排序算法必须是稳定的。
应用:
用基数排序来对具有多个关键字域的记录进行排序。
桶排序
假设数据服从均匀分布。
桶排序将[0,1)区间划分成n个大小相同的区间,称为桶。然后把n个输入分别放到各个桶中。再对各个桶的数据排序。
因为数据是均匀分布的,所以不会出现很多数据落在同一个桶的情况。
中位数和顺序统计量
最大值、最小值:因为每个元素都需要比较,所以时间复杂度为 。
中位数和顺序统计量:时间复杂度也为 。思想类似于快排。只不过只处理递归划分的一边即可。