算法(二)之排序---线型排序

常见的线型排序时间复杂度是O(n),有桶排序、计数排序、基数排序。

1.桶排序(Bucket sort)

其实桶排序就是spark全局排序的思想,先把要排序的内容取样,然后数据去分段hash,不就是hash到一个分段有序的桶中了吗!
mr的默认实现并没有利用桶排序思想,所以只能在一个reduce进行排序,排序过程虽然用了归并排序不会内存溢出,但是也要串行遍历n次数据,并且每次从迭代器遍历出数据都要在小顶堆进行排序,因此并不高效。
那是不是就是说桶排序无敌了呢,其实不然,桶排序的关键点在于这个取样算法是否准确,如果不够准确,最坏的情况就是所有数据分到一个桶中了。这样就退步到O(nlogn)了(桶中的排序使用快排)。
桶排序比较适合用在外部排序中。所谓的外部排序就是数据存储在外部磁盘中,数据量比较大,内存有限,无法将数据全部加载到内存中。是大数据中常用的算法思想。

2.计数排序(Counting sort)

计数排序其实是桶排序的一种特殊情况。当要排序的 n 个数据,所处的范围并不大的时候,比如最大值是 k,我们就可以把数据划分成 k 个桶。每个桶内的数据值都是相同的,省掉了桶内排序的时间。
适用于k不太大的情况。

3.基数排序(Radix sort)

将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。
从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。
等到低位排完得到一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。

假设三个字母排序,排序思路是先按照个位排序,然后按照百位排序,然后按照千位排序,完成。主要借助稳定排序思想。
不过基数排序对要排序的数据也是有要求的,需要可以分割出独立的“位”来比较,而且位之间有递进的关系,位数也要相同。如果 a 数据的高位比 b 数据大,那剩下的低位就不用比较了。
除此之外,每一位的数据范围不能太大,要可以用线性排序算法来排序,否则,基数排序的时间复杂度就无法做到 O(n) 了


问题来了,如何根据年龄给 100 万用户排序?哪种最快。

猜你喜欢

转载自www.cnblogs.com/jiangxiaoxian/p/9943064.html