桶排序

前言

         软考考了两次还是没有过,主要是因为还没有找到学习算法的技巧,米老师着急了,再一次给我上了一节算法课。

 

兴趣是最好的老师

      米老师再给我们将桶排序之前,把桶排序和选择排序的运行效果进行比较,发现桶排序的速度比选择排序快很多,然后就对排序有了很浓的兴趣,想知道它的原理,为什么会那么快。同时也到网上淘了本《哈希算法》,真所谓是兴趣是最好的老师。接下来米老师给我们讲了桶排序,觉得挺简单的,可是自己回来敲的时候也可谓是一波三折啊。

 

桶排序概述

       桶排序也叫箱排序,工作原理是将数组分到有限数量的桶子里。每个桶子再个别排序。比如:有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这样的数组中也是够呛的,那么我们又改用什么样的算法来将这组数进行排序呢?性能优化必然涉及到算法,看来在什么情况下选择使用什么样的算法是一个很重要的问题,但是前提是我们也要对这些算法熟悉。继续往下学吧。

评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值