桶排序,C语言实现

上面提到基于比较的排序算法的时间复杂度最低是O(N * logN)。如果基于其它类型的算法,是不是可以突破O(N * logN) 这个限制呢?事实上是有的。我们接下去就介绍时间复杂度为O(N)的桶排序:
如果一个班级里16个学生进行考试,考试成绩最高10分,最低0分。请按照成绩从低到高进行排序。
我们分析一下,得分一共有11种可能,分别是0, 1, 2。。。10。我们可以放11个桶,然后对每一个得分进行统计,例如成绩是5分,就在5号桶加一张小纸片;成绩是9分,就在9号桶加一张小纸片。最后按照0~10号桶,依次把桶中的纸片拿出来,每张纸片上写着对应的成绩。这样就可以得到排好序的结果了。
代码如下:

#include <stdio.h> 
#include <stdlib.h>

int arr[] = {4, 1, 5, 7, 3, 2, 9, 8, 6, 0, 5, 4, 3, 6, 7, 8}; //要排序的数据
int size = 16; //一共16个数据
int bucketNum = 11; //11个桶

void bucketSort() //桶排序
{
	//做11个桶,编号分别是0,1,2...10,桶里没有纸片
    int arrBucket[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
    //把数据加入到对应的桶中
    for (int i = 0; i < size; i++)
    {
    	int n = arr[i]; //找到对应的桶的编号 
        arrBucket[n]++; //对应的桶中的数据量 + 1 
    }

    //从小到大,依次把桶中的纸片拿出来
    //虽然这里有两层for循环,但一共就n个数据,所以时间复杂度为O(N)
    int k = 0;
    for (int i = 0; i < bucketNum; i++) //遍历每一个桶
    {
        for (int j = 0; j < arrBucket[i]; j++) //遍历每一个桶中的纸片
        {
            arr[k] = i; //把数据重新写回到arr中 
            k++;
        }
    }
}

int main()
{
	bucketSort(); //桶排序 
	return 0;
}

桶排序不同于前面的比较排序,它是基于统计方法设计的排序方法。它的时间复杂度为O(N)。空间复杂度也是O(N)。桶排序是有缺陷的,如果要排序的数字分布特别大,例如1, 2, 10000。仅仅三个元素,却需要10000个桶,遇到这样的情况,用桶排序就不合适了。另外,如果排序的数字中有小数,桶排序也就没法使用了。
桶排序最好使用在数据相对集中,又有很多相同数据的情况。例如统计一个省的高考成绩,高考成绩分布在0 ~ 750之间,我们只需要建751个桶,就能把全省几十万考生的结果都统计出来,甚至还能单独挑出600分的人有多少,500分的人有多少等信息。

猜你喜欢

转载自blog.csdn.net/wangeil007/article/details/107654358