桶排序
快速桶排序就是先创建出来一个一维数组,并把这个数组当中的变量都初始为0,然后把数组当中每个与输入数据相同的编号的变量加一,然后把数值大于等于1的变量按照从大到小或者从小到大的顺序都打印出来。
当然这样说的话,学程序的人是能够看一下就大概明白我说的是什么了,但是放假前老师对我的要求是让我能讲出来,并且让别人能够简单明了的看懂,这就让我很为难了,不过这也确实是一个不错的学习方法,所以我想到的并且能够做到的办法就是换个说法:
首先定义一个数组(或者说先拿一些小水桶?),数组当中每个变量就相当于一个桶。
“每个与输入数据相同的编号的变量加一”的意思就是数组当中的每个变量都有一个编号,对吧?例如:a[5],a[8]。上面那句话就是如果输入的数据当中如果有5或者8的话,就让数组当中的a[5],a[8]的值加一。
当然这样说的话就是偏向于学术说法了,那我换个说法,你刚才拿过来了一些小水桶对吧?咱们就假设那些水桶上都有着属于自己的编号,比如:1,2,3,4,5等等。
然后你手里有一些小弓箭,当然这些弓箭上也有着编号,然后你要做的就是找到和弓箭上编号相同的小水桶,并把对应的弓箭放进去。
“值加一”的意思就是,你放进去一个弓箭那个小水桶里就有一个弓箭,你再放一个,那么就有两个弓箭,或许这样的说法,你可能会说我是在说废话,但是这就是在实现“值加一”的方式。简单来说就是有几个和水桶上编号相同的弓箭数值就加几,代表着往水桶里放几个弓箭的意思。
最后当你把所有的弓箭放完之后就是再按照水桶编号从小到大或者是从大到小的方式把那些弓箭拿出来并在地上摆成一排(从同一个水桶里拿出来的弓箭就按照你拿出来的顺序排下去就好了)。
这样咱们把弓箭排好之后的结果就是进行桶排序之后的输出结果。
接下来要做的就是把这些行为用C语言描述出来
详细代码:
#include<bit/stdc++.h>//C语言万能头文件
Int main()
{
Int a[101],i,j,k,n
for(i=1,i,<=100,i++)
a[i]=0;//定义一个数组,并把数组当中的变量初始为0
Scanf(“%d”,&n)//输入一个数n,表示接下来有多少个数
For(i=0,i<=n,i++)
{
Scanf(“%d”,k)//把每一个数读到变量K中
a[k]++;//进行计数,对编号为K的水桶中放一个弓箭
}
For(i=100;i>=0;i--)//依次判断编号100~0的桶
//(当然我更喜欢的说法是按照从大到小的顺序读取数组
//当然如果是想按照从小到大的顺序读取的话那就把这行代码换成:for(i=0;i<=100;i++)就可以了)
For(j=1;j<=a[i];j++)//把数值大于等于1的水桶的编号一次打印出来,数值为几就打印几次,数值为零的不打印
Printf(“%d”,i)
Return 0;
}
好了,到此桶排序的算法就说完了,或许我有没说清楚的地方,但是我已经尽了我最大的努力来让别人或者是未来想要学习的自己能够看懂我在说什么。
来源:CSDN
作者:mistake_boss
链接:https://blog.csdn.net/mistake_boss/article/details/103965106