c语言桶排序最后不输出空格,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.桶排序的局限

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值