十大排序算法-桶排序 c语言实现

 介绍

       桶排序是一种分布式排序算法,它的基本思想是将待排序的元素分布到不同的桶中,然后对每个桶中的元素进行排序,最后将所有桶中的元素依次取出,得到排序后的序列。

代码实现

//桶(桶的数量增加会使消耗的内存增加)
int compare(const void* e1,const void* e2){
    if(*(int*)e1>*(int*)e2)
        return 1;
    else if(*(int*)e1<*(int*)e2)
        return -1;
    else
        return 0;
}
void bucketSort(int* base, int len, int bucketSort_num){
    if(base==NULL||len<=1||bucketSort_num<=2)
        return;

    //找出最大值和最小值确定范围
    int value_max = base[0];
    int value_min = base[0];
    for(int i=1;i<len;i++){
        if(base[i]>value_max)
            value_max = base[i];
        if(base[i]<value_min)
            value_min = base[i];
    }
    int base_range = value_max-value_min+1;

    //单个桶的范围
    int bucket_range = base_range/(bucketSort_num)+(base_range%bucketSort_num?1:0);

    //为每个桶申请内存
    int* buckets = (int*)malloc(bucketSort_num*len*sizeof(int));
    //每个桶中数据的数量
    int* num_data_buckets = (int*)malloc(bucketSort_num*sizeof(int));
    if(buckets==NULL||num_data_buckets==NULL)
        return;
    memset(num_data_buckets,0,bucketSort_num*sizeof(int));

    //数据存入对应桶中
    for(int i=0;i<len;i++){
        int index_bucket = (base[i]-value_min)/bucket_range;
        *(buckets+index_bucket*len+(num_data_buckets[index_bucket]++)) = base[i];
    }

    //对每个桶进行排序,这里使用插入排序对每个桶进行排序
    for(int i=0;i<bucketSort_num;i++){
        if(num_data_buckets[i]>1){
            insertionSort(buckets+i*len,num_data_buckets[i],sizeof(int),compare);
        }
    }
    
    //将排好序的桶中的数据写回原数组
    for(int index=0, i=0;i<bucketSort_num;i++){
        for(int j=0;j<num_data_buckets[i];j++){
            base[index++] = *(buckets+i*len+j);
        }
    }

    free(buckets);
    free(num_data_buckets);

}

参数介绍

        函数bucketSort接受四个参数:base: 整数数组,需要排序的数组。len: 整数,数组的长度。bucketSort_num: 整数,桶的数量。

总结

        桶排序适用于数据分布比较均匀的情况,对于数据分布极端不均匀的情况,可能会导致性能下降。        

        桶排序的时间复杂度为O(n+k),其中n为数组长度,k为桶数量。当桶数量增加时,消耗的内存也会增加。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值