排序——桶排序

来源:互联网 发布:pc网络电视直播软件 编辑:程序博客网 时间:2024/06/05 16:18

假设现在有5个数字需要排序,分别是1 5 5 8 6;现在需要对这5个数字由小到大进行排序

-1.首先是申请一个一维数组,这里我申请一个大小为11的数组int a[11],这样就可以对大小为0~10的数字进行排序【上面给出的5个数字中最大的是8,所以我们也可以申请一个大小为9的数组(0~8)】,在开始的时候,将数组a[0]到a[10]都初始化为0,表示为0~10的数字都还没有出现过。例如:a[0]=0表示0这个数字还没有出现过,a[1]=2表示1这个数字出现过两次。

int a[11];for(int i=0;i<=10;i++){a[i]=0;}

-2.处理数字
第一个数字是1,那么就将对应的a[1]的值在原来的基础上增加1,表示1出现过一次。
第二个数字是5,就将对应的a[5]的值在原来的基础上增加1,表示5出现了一次。
第三个数字是5,就将对应的a[5]的值在原来的基础上增加1,即a[5]=2,表示5出现2次……同理余下的其他数字也是按照这种方法进行赋值。全部完毕后,a[1]=1,a[5]=2,a[6]=1,a[8]=1。其他均为0
-3.打印数字
数组a[0]~a[10]的值表示的就是0~10这11个数字出现的次数,只需要将出现过的数字打印出来,就完成了对数字的排序。

forint 1=0;i<=10;i++){for(int j=1;j<=a[I];j++ ){printf(“%d”,i);}}最后输出数据就是 1 5 5 6 8如果要改为从大到小排序,只需要将输出部分的循环改为for(int i=10;i>=0;i- -)

总结:桶排序更适合数字较为集中,而且只要求对数字进行排序的情况。例如对1 0 21000000 20000001 3这样子的5个数进行排序,你要需要申请21000000个“桶”来进行排序,这样会变得十分浪费空间,而且当需要排序的数不是整数,而是一些小数 的时候,使用桶排序也是极其不方便的。