数据结构:线性排序

王争数据结构笔记(13)&(14)

1、桶排序 、计数排序、基数排序均是时间复杂度为O(n)

2、桶排序比较适合在外部排序中使用。桶排序对排序数据的要求比较苛刻:要排序的数据需要容易划分为m个桶,并且桶与桶之间有着天然的大小顺序。其次数据在各个桶之间的分布比较均匀。在极端情况下,如果数据都被划分到一个桶中,其时间复杂度为O(nlogn)。

3、计数排序只能在数据范围不大的场合,如果数据范围k比排序数据n大很多,不适合用计数排序。计数排序知识和给非负整数排序,如果要排序的数据是其他的类型,需要对其进行转化。

4、基数排序:基数排序对排序数据有要求,需要其可以分割出独立的位进行比较,而且位之间有递进关系。此外,每一个位的数据范围不能太大,要可以用线性排序算法(桶排序或者计数排序)进行排序。

5、

排序总结
  时间复杂度 是否稳定排序 是否原地排序
冒泡排序 O(n^2)
插入排序 O(n^2)
选择排序 O(n^2)
快速排序 O(nlogn)
归并排序 O(nlogn)
计数排序 O(n+k),k是数据范围
桶排序 O(n)
基数排序 O(dn),d是维度

 

6、线性排序算时间复杂度比较低,适用场景比较特殊。对于通用的排序函数,不能选择线性排序算法。小规模数据排序可以选择O(n^2),大规模数据排序选择O(nlogn)。比较通用的排序包括归并排序、快速排序、以及堆排序。Java中使用堆排序实现排序函数,而C中使用快速排序实现排序函数。

7、快排的优化:快排在分区点不合理的情况下会出现O(n^2)时间复杂度。因此需要设计一些分区算法:三数取中法,随机法。三数取中法从区间的首、尾、中分别取出一个数,然后对比大小,取这三个数的中间值作为分区点。如果排序的数组比较大的时候,这种三数取中可能不够,需要五数取中等等。随机防范是从排序区间中随机选择一个元素作为分区点。这种方法不能保证每次分区点都选的比较好,但是从概率的角度来说,也不大可能出现每次分区点都选得很差的情况。

8、对于小规模数据O(n^2)不一定比O(nlogn)差。所以在小规模的情形下,我们可以选择简单的,不需要递归的插入排序。

9、C语言中的qsort()分析:qsort()优先使用归并排序进行排列,在数据量不大的情况下使用空间来换取时间。只有在要排序较大数据量的时候,qsort()会改用快速排序进行排序。qsort()在快排的分区点上采用了三数取中方案。考虑到递归太深导致堆栈溢出的问题,qsort()采用手动模拟递归的方式。此外,对于排序的区间中,元素个数小于等于4个的情形,qsort()退化为插入排序,不再继续用递归来做快速排序。

 

 

你可能感兴趣的:(数据结构)