C语言: 桶排序

Posted 小威威__

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言: 桶排序相关的知识,希望对你有一定的参考价值。

C语言: 桶排序

标签: C语言 桶排序

by 小威威


1.桶排序的介绍

通俗地来说,桶排序就是将数组内的元素按照一定规则分配到一定数量的桶中,然后将各个桶内的数字进行分别排序,最后再将它们串起来。倘若我们要对很多数据进行冒泡排序,这种分桶的方式就大大提高了冒泡排序的执行效率。因为在处理较少的数据时,冒泡排序的执行效率并不亚于其他排序,甚至不亚于快排。然而,我今天要讲的桶排序是另一种类型。

2.桶排序的思想

我的桶排序,是比较耗内存的,但是代码十分简单,如果对内存没有那么严格的要求的话,优先采用我的方法。

我的思路是:一个桶代表一个数字,数组内数字应分配到与桶编码相等的桶中去。(不难想到要先求出数组的最大值,因为数组的最大值是决定桶数量的重要依据)。每个桶都有一个编号,编号从0开始。然后每个桶内装的是数组内等于该编号的元素的个数,初始值为0。接下来对数组内的数字进行检测,检测到该数字,对应编码的桶就+1。当检测完毕时,各个桶就完成了对数组内数字的统计。接下来,我们可以按照桶的编号从0开始一次输出桶的编号,根据桶内数字决定这个桶输出编号的次数。如此,输出的数据必是从小到大。

以下是实现桶排序的函数:

int Max(int *pArr, int len)   // 求出数组最大值
    int max = pArr[0];
    for (int i = 0; i < len; i++) 
        if (max < pArr[i]) 
            max = pArr[i];
        
    
    return max;

// pArr指数组指针,len指长度,max指数组的最大值
void Bucket_sort(int *pArr, int len, int max) 
    int *bucket;
    bucket = malloc((max+1) * sizeof(len));// 动态分配内存,注意要max+1,因为编号是从0开始的。
    memset(bucket, 0, (max+1)*sizeof(len));// 将数组内的元素全部置0
    for (int i = 0; i < len; i++) 
        ++bucket[pArr[i]]; // 其实数组内的数字对应的就是桶的下标
    
    for (int i = 0; i <= max; i++)
        for (int j = 0; j < bucket[i]; j++)
            printf("%d ", i);
    free(bucket);
    bucket = NULL;

倘若你要将数组排序,而不是简单地按照顺序输出,你可以定义一个新的数组,然后将最后的printf语句改为元素的赋值语句,即:

 int a[100];
 int count = 0;
 for (int i = 0; i <= max; i++)
     for (int j = 0; j < bucket[i]; j++) 
             a[count] = i;
             count++; 
     

3.桶排序的局限

众所周知,桶排序的缺点是占用内存较大。而且,我们需要注意的是桶排序的适用范围:也就是数据较为集中的时候。数据越集中,桶的数量就越小。但是,我们不能否认,桶排序的速度真的很快,甚至在一定条件下比快排还快。


以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨。


以上是关于C语言: 桶排序的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现简化版桶排序

C语言: 桶排序

java实现桶排序

排序算法c语言描述---桶排序

C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)

大量数据常采用的高效排序算法:桶排序计数排序基数排序