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语言: 桶排序的主要内容,如果未能解决你的问题,请参考以下文章