算法导论学习笔记(二)排序和顺序统计量

总结各种排序算法,时间复杂度与空间复杂度,优缺点等。

堆排序

堆排序的时间复杂度是 θ ( n log n ) ,堆排序具有空间原址性。

堆是一个数组,可以看成一棵近似的完全二叉树。除了最底层之外,该树完全填满,给定一个节点i,可以很容易地计算其父节点为floor(i/2),左子节点为2i,右子节点为2i+1.

最大堆是指堆中最大元素存在根节点。

建立堆

堆排序:建立最大堆,然后把根元素与最后一个元素交换位置,再把节点n去掉,并使得剩余n-1个节点重新满足最大堆。重复此过程,则将按照从大到小的顺序依次把元素从堆中取出。从而完成排序。

快速排序

快排平均时间复杂度是 θ ( n log n ) ,最坏时间复杂度是 θ ( n 2 )

但是快排通常是实际应用中最好的选择,原因如下:

  • 原址排序
  • 平均性能非常好,虽然平均时间复杂度是 θ ( n log n ) ,但是常数因子小得多

快排:在数组中随机找到一个元素,交换数组中其他元素的位置,使得该元素左边的数都比他小,右边的数都比他大。递归调用。

从快排的原理,易知其平均时间复杂度是 θ ( n log n ) ,在最坏的情况下,相当于插入排序,因此时间复杂度是 θ ( n 2 )

快排的随机化版本

为了增加随机性,使得划分更加均匀,每次随机从数组中挑选一个元素作为划分节点。

线性时间排序

所有基于比较的排序方法的时间复杂度的上界是 θ ( n log n ) 。存在其他不适基于比较的排序算法,可以达到线性时间复杂度。

计数排序

假设n个输入元素的每一个都是在0-k之间的一个整数。时间复杂度为 θ ( n )

计数排序的过程是:对每个输入的元素,都统计比它小的元素的个数。这样就可以直接把它在输出数组的位置上插入。当有几个元素相同时要稍作修改。

基数排序

基数排序是指先按照最低有效位进行排序来解决卡片排序问题。之所以先按照最低有效位排序,是因为高位比低位优先级要高。为了确保基数排序的有效性,一位数排序算法必须是稳定的。

应用:

用基数排序来对具有多个关键字域的记录进行排序。

桶排序

假设数据服从均匀分布。

桶排序将[0,1)区间划分成n个大小相同的区间,称为桶。然后把n个输入分别放到各个桶中。再对各个桶的数据排序。

因为数据是均匀分布的,所以不会出现很多数据落在同一个桶的情况。

中位数和顺序统计量

最大值、最小值:因为每个元素都需要比较,所以时间复杂度为 θ ( n )

中位数和顺序统计量:时间复杂度也为 θ ( n ) 。思想类似于快排。只不过只处理递归划分的一边即可。

猜你喜欢

转载自blog.csdn.net/u014230646/article/details/79689625