线性时间的桶排序介绍与理解(含c源代码)
来源:互联网 发布:三家运营商的网络制式 编辑:程序博客网 时间:2024/05/18 03:32
桶排序的介绍:它的思想就是把区间分成均匀的大小相同的子区间(也称为桶);比如将100以内的数排序,就可以分成10个区间(桶);第一个1-10,第二个11-20;第三个21-30;.......第十个91-100;所取得的数放到对应的桶中,如果一个桶出现相同的,并要对它进行正确的处理;
编程思维:利用上一章节的基数排序,我们可以利用数组的下标从而按照个,十,百的相应位数进行排序,而数组下标与基数排序就能够很好的衔接起来;比如 134,321;利用数组arr[i][j]进行第一次个位分别为4,1存取就会是134存到arr[4][1];321存到arr[1][1];依次进行下去;进行第二次十位分别为3,2存取就会是134存到arr[3][1];321存到arr[2][1];进行第三次百位分别为1,3存取就会是134存到arr[1][2];321存到arr[3][2];特别注意,j的数出现依次就会加1;
程序源代码如下:
#include< stdio.h>#include< stdlib.h>#include< math.h>#define MAX 100 //生成的数的个数定义;void bucket_sort(unsigned *,int); //桶排序函数的原型void print(unsigned *,int); //打印函数的原型int main(){unsigned array[MAX];int i=0;//为数组元素随机赋值for(i=0;i< MAX;++i)array[i]=rand(); //随机生成数;如果你想设置生成数的范围,如100范围内rand()0 ;printf("排序前的顺序:\n");print(array,MAX);//排序bucket_sort(array,MAX);printf("排序后的顺序:\n");print(array,MAX);return 0;}void bucket_sort(unsigned * arr,int len){unsigned *buckets[10]; //指针数组,也就是二维数组;unsigned b=0,n; //用于取整数各位上的值;b为指数n为1,10,100...;int index; //数组下标计数索引int indexs[10]; //各个桶下标计数索引int i,j;//分配动态内存作为桶for(i=0;i< 10;++i)buckets[i]=(unsigned *)malloc(sizeof(unsigned)*len);while(1){//计数索引清零index=0;for(i=0;i< 10;++i)indexs[i]=0;//数组至桶,同时利用数组的特性运用到了基数排序;for(i=0;i< len;++i){ n=pow(10,b);buckets[arr[i]/n][indexs[arr[i]/n]++]=arr[i];//printf("#%d,",indexs[arr[i]/n]);}//桶至数组for(i=0;i< 10;++i)for(j=0;j< indexs[i];++j)arr[index++]=buckets[i][j];//为取元素的下一位做准备b++;//判断是否该结束for(i=0;arr[i]< n&&i< len;++i);if(i==len) break;}//释放动态内存for(i=0;i< 10;++i)free(buckets[i]);}void print(unsigned * arr,int len){int i=0;for(i=0;i< len;++i){printf("m",arr[i]);//10个元素一行if((i+1)==0)printf("\n");}}
运行结果:
随机生成的100个数:
随机生成的100个数:范围0~100
总结:
线性时间排序中的计数,基数,桶排序;相互之间都存在一种关系,有数组就能够很好地衔接起来;计数对于大的数开辟的空间过于浪费;它的原理是一一对应的;基数排序则是通过从右到左,从个位,十位,百位..进行排序,对于计数排序而言,具有比较大的优势,空间节省;桶排序利用了均匀分布的思想,空间和时间复杂度相比前面都有很大的优势!!很经典的语句:buckets[arr[i]/n][indexs[arr[i]/n]++]=arr[i];
0 0
- 线性时间的桶排序介绍与理解(含c源代码)
- 线性时间排序中的基数排序(c语言)的介绍与理解
- 贪心算法的分数背包问题的介绍与理解1(含c源代码)
- 动态规划0-1背包问题的介绍与理解(含c源代码)
- 贪心算法活动选择问题介绍与理解(含c源代码)
- 动态规划中的矩阵链乘法的介绍与理解(包含c源代码)
- 线性时间的排序
- 数据结构与算法——线性时间排序(计数排序、基数排序、桶排序)
- 光流法的介绍(含C++代码)_醉翁【图像理解】_百度空间
- 动态规划中的最长公共子序列的介绍与理解(c源代码和改进方法的代码,有清晰的介绍与注释)
- 《算法导论》9、三个线性时间排序(C++)
- 线性时间的排序算法
- 线性时间的计数排序
- 貌似桶排序的快速排序—线性时间
- 线性时间排序(一)C语言
- 线性时间排序(二)C语言
- 线性时间排序(三)C语言
- c语言经典排序算法(8种-含源代码)
- office 2013每次打开都需要配置才行进入程序的解决办法
- jrtplib使用笔记
- ObjectARX向导安装路径问题及解决方案
- windows 命令行中使用winrar
- [GEiv]第一章:静态绘制(三) 转置、尺度变换与混合通道
- 线性时间的桶排序介绍与理解(含c源代码)
- 网卡驱动注册到PCI总线这一过程的分析二
- cocostudio ui编辑器的使用----代码部分1
- Linux keepalived与lvs的深入分析
- 分布式和集群的概念
- Nginx配置参数说明
- redis 2.6.9安装报错解决
- 删除链表节点
- 有趣的C语言问答