排序算法之桶排序

桶排序通常是一中非常高效的排序算法,它通过空间换取时间,可以做到线性时间复杂度,具体算法介绍如下:

1、什么是桶排序?

在已知数据的范围的条件下,通过将数据装入对应范围的桶中,最后扫描桶来实现排序。显然,这个算法应用的前提是需要知道所排序数据的范围。

2、桶排序举例

(1)对1万学生的数学成绩进行排序

假设对1万学生的数学成绩进行排序,分数默认为(0-100,假设为整数),应用桶排序的过程如下:

首先,建立101个桶,用数组a[0...100]表示,一次扫描1万条数据,根据每条数据的值,记录到对应下标的桶中。比如,小明的分数是90,则a[90]加一;然后扫描这101个桶,即可得到有序数组。如:

一个简单的示例:    所有的数据都在0-5范围内:

4,5,2,3,1,4,3,2,1,5,2,2,4,5,1,3,4,1,3,2,2

排序后.....

1,1,1,1,2,2,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5

(2)将20个范围为0-999的整数进行排序

如果按照1中的思路,则需要创建999个桶,然后进行一趟桶排序即可。

但是还有另外一种方式,只创建10个桶,但是要进行3趟桶排序。

10个桶对应0-9 一共10个不同的数字,说白了就是一个长度为10的整型数组。3趟桶排序是因为:0-999范围内的数由3个位组成:个位、十位、百位

第一趟对个位数进行桶排序,根据个位数的值,将该数放入对应的桶中,比如425,个位数为5,则将425放到a[5]中---(这是将元素本身放到桶中,不是计数,这种方式待排序的元素个数不能超过桶的个数!!!)

第二趟对十位数进行桶排序,根据十位数.....

第三趟对百位数进行桶排序,根据百位数.....

具体的实现可以这样:

在第一趟桶排序时,将待排的20个数依次放到桶中。然后,再把这20个数拷贝回原数组,然后再根据 十位 数排序:根据十位数的大小 将这20个数 按顺序放到桶中,然后再把十位数有序的桶中的数据复制回原数组......百位数....

最终,原数组中的数据就是 已经排好序的数据了。

3、桶排序时间复杂度分析

桶排序可以做到线性时间复杂度,比如上面的1万名学生的成绩排序。将1万条成绩数据输入,复杂度是O(N),输出排序结果时遍历每个桶复杂度是O(M),故总时间复杂度是O(M+N)。而这种情况下桶的个数远远小于数据条数。

对于使用多趟桶排序的情形,时间复杂度是O(p(N+b)),其中N是输入的数的据量,b是桶的个数,p是桶排序趟数。

 

你可能感兴趣的:(桶排序,C++,算法学习)