前言
软考考了两次还是没有过,主要是因为还没有找到学习算法的技巧,米老师着急了,再一次给我上了一节算法课。
兴趣是最好的老师
米老师再给我们将桶排序之前,把桶排序和选择排序的运行效果进行比较,发现桶排序的速度比选择排序快很多,然后就对排序有了很浓的兴趣,想知道它的原理,为什么会那么快。同时也到网上淘了本《哈希算法》,真所谓是兴趣是最好的老师。接下来米老师给我们讲了桶排序,觉得挺简单的,可是自己回来敲的时候也可谓是一波三折啊。
桶排序概述
桶排序也叫箱排序,工作原理是将数组分到有限数量的桶子里。每个桶子再个别排序。比如:有5,3,5,2,8,需要对这组数用桶排序进行比较,这个时候我们可以先定义0-10个桶,桶的编号为0-10,再把数字放到所对应的桶中,并给相应的桶进行计数。5就放在第5个桶,这个时候就给第5个桶标上1,3的时候就放在第三个桶里,然后在第三个桶标上1,3后面的5是第二次出现,在第5个桶上再加1,也就是二了,依次类推下去。这个时候呢已经把这个5个数放在桶子里了,我们就可以桶的记号大于0的桶拿出来,如果记号为1就拿出一次,如果是二就拿出两次,到最后,你会发现拿出来的桶的编号就是排序好的数组了。如图所示
实践
说了那么多,不到代码中练练也是不行滴。
<span style="font-size:18px;"> public static void Main(string[] args)
{
int[] a = new int[11];//定义11个桶,编号从0-10,也就是有11个变量
for (int i = 0; i <= 10; i++)//遍历11个桶
{
a[i] = 0;//对桶进行初始化
}
int t = 0;//定义某一个桶的初值为0
Console.WriteLine("程序启动,请准备输入成绩!");
for (int i = 0; i < 5; i++)//遍历输入5个学生的成绩
{
Console.WriteLine("请输入【学生" + (i + 1).ToString() + "】的成绩:");//因为对应的桶最大的数是10 所以不能输入比10大的数
t = Convert.ToInt32(Console.ReadLine());//把输入的成绩放入对应的桶中
a[t] = a[t] + 1;//对桶进行计算,每放进一个数加一
}
Console.WriteLine("成绩输入完成,进行桶排序!");
Console.WriteLine("桶排序:");
for (int i = 0; i <=10; i++)//依次判断这11个所对应了多少次成绩
{
if (a[i] != 0)//判断桶内是否有成绩
{
for (int j = 1; j <= a[i]; j++)//循环遍历桶的下标值,也就是桶所对应的成绩
{
Console.WriteLine(i);
}
}
}
Console.WriteLine("请按任意键退出!");
Console.ReadKey();
}</span>
总结
桶排序在数字分布均匀的情况下是挺快的,但如果在类似于 1,6, 18888这样的数组中也是够呛的,那么我们又改用什么样的算法来将这组数进行排序呢?性能优化必然涉及到算法,看来在什么情况下选择使用什么样的算法是一个很重要的问题,但是前提是我们也要对这些算法熟悉。继续往下学吧。