蓝桥杯算法基础(17):十大排序算法(桶排序)c语言版

桶排序(Bucket sort)

待排序数列 21 3 30 44 15 36 6 10 9 19 25 48 5 5 23 47

|5|
|9| |19| |23|      |47|
|6| |10| |25| |36| |46|
|3| |15| |21| |30| |44|
 0   1   2     3    4

5个桶
假设输入数据服从均匀分布,将数据分到有限数量的桶里,然后再堆每个分别排序,最后把全部桶的数据合并
桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少,但相应的空间消耗就会越大

桶排序主函数,参数arr是待排序数组的首地址,len是数组元素的个数
void bucketsort(int *arr,unsigned int len){
     int bucket[5][5];//分配五个桶
     int bucketsize[5];//每个桶中元素个数的计数器
     //初始化桶和桶计数器
     memset(bucket,0,sizeof(bucket));//每个元素赋0
     memset(bucket,0,sizeof(bucketsize));

     //把数组arr的数据放入桶中
     int ii=0;
     for(ii=0;ii<len;ii++){
     bucket[arr[ii]/10][bucketsize[arr[ii]/10]++]=arr[ii];//放入桶之后,相应桶内元素数量记录+1
     //对每个桶进行冒泡排序//也可以是插入排序等等,就是将桶内元素排序
     for(ii=0;ii<5;ii++){
        bubblesort(bucket[ii],bucketsize[ii]);//bubblesort(int arr[],int length)

     }
     把每个桶中的数据填充数组arr中
     int jj=0,kk=0;
     for(ii=0;ii<5;ii++){

        for(jj=0;jj<bucketsize[ii];jj++){
         arr[kk++]=bucket[ii][jj];//根据每个桶内拥有的元素个数,进行赋值,从小桶到大桶
        }
     }
}

//(1)如果数据分布不均匀,大量的数据集中在少数桶里。桶排序就没效果了
//(2)桶排序要时间就省不了空间,要空间就省不了时间。结论是桶排序意义不大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值