桶排序(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)桶排序要时间就省不了空间,要空间就省不了时间。结论是桶排序意义不大
蓝桥杯算法基础(17):十大排序算法(桶排序)c语言版
最新推荐文章于 2024-09-12 19:02:20 发布