PCB 挺有意思的基数排序----C#代码实现

今天在头条看一个很有意思的排序算法【基数排序】,以前所学习的排序算法都是基于数值对比的方式排序的,而这个算法挺有意思的非常独特。但从网上看到的例子通常是对个位,十位处理,并转为对应的桶索引的方式实现,这里将此算法用C#实现,并以位运算的新方式实现。

一.代码实现

        static void Main(string[] args)
        {
            //待排序数组
            List<int> arrlist = new List<int>() { 72, 11, 82, 32, 44, 13, 17, 95, 54, 28, 79, 56 };
            int Number = 3;               //基数   网上教材都是基于个位,十位,百位进行运算,这里通过位数计算
            int NumCount = 1 << Number;   //桶数   位数是3那么桶数是8,  位数是4那么桶数是16
            List<List<int>> intList = new List<List<int>>(); //建立好桶
            for (int i = 0; i < NumCount; i++)
            {
                intList.Add(new List<int>());
            }
            int LayerCount = 3; //位数划分组数(计算方法:数组最大值为95,对应二进制为:1011111,基数为3的话,可以分为1,011,111; 组数为3)
            //算法实现-----算法复杂度(nxm)
            for (int k = 1; k <= LayerCount; k++) //最大整数最高位数划分组数
            {
                intList.ForEach(tt => tt.Clear());
                foreach (var item in arrlist)
                {
                    int index = item & ((1 << k * Number) - 1); //左移加与位运算 求桶索引
                    index = index >> (k - 1) * Number;//右移加与运算  求桶索引
                    intList[index].Add(item);
                }
                arrlist.Clear();
                for (int i = 0; i < NumCount; i++)
                {
                    for (int j = 0; j <intList[i].Count; j++)
                    {
                        arrlist.Add(intList[i][j]);
                    }
                }
            }
            //输出
            arrlist.ForEach(tt=>Console.WriteLine(tt));
            Console.ReadKey();
        }

二.输出排序结果:

三 .基数排序算法介绍:

基数排序的两个关键要点:

(1)基:被排序的元素的“个位”“十位”“百位”,暂且叫“基”,栗子中“基”的个数是2(个位和十位);

画外音:来自野史,大神可帮忙修正。

(2)桶:“基”的每一位,都有一个取值范围,栗子中“基”的取值范围是0-9共10种,所以需要10个桶(bucket),来存放被排序的元素;

基数排序的算法步骤为:

FOR (每一个基) {

//循环内,以某一个“基”为依据

第一步:遍历数据集arr,将元素放入对应的桶bucket

第二步:遍历桶bucket,将元素放回数据集arr

}

更具体的,对应到上面的栗子,“基”有个位和十位,所以,FOR循环会执行两次。

【第一次:以“个位”为依据】

画外音:上图中标红的部分,个位为“基”。

第一步:遍历数据集arr,将元素放入对应的桶bucket;

操作完成之后,各个桶会变成上面这个样子,即:个位数相同的元素,会在同一个桶里。

第二步:遍历桶bucket,将元素放回数据集arr;

画外音:需要注意,先入桶的元素要先出桶。

操作完成之后,数据集会变成上面这个样子,即:整体按照个位数排序了。

画外音:个位数小的在前面,个位数大的在后面。

【第二次:以“十位”为依据】

画外音:上图中标红的部分,十位为“基”。

第一步:依然遍历数据集arr,将元素放入对应的桶bucket;

操作完成之后,各个桶会变成上面这个样子,即:十位数相同的元素,会在同一个桶里。

第二步:依然遍历桶bucket,将元素放回数据集arr;

操作完成之后,数据集会变成上面这个样子,即:整体按照十位数也排序了。

画外音:十位数小的在前面,十位数大的在后面。

首次按照个位从小到大,第二次按照十位从小到大,即:排序结束。

神奇不神奇!!!

几个小点:

(1)基的选取,可以先从个位开始,也可以先从十位开始,结果是一样的;

(2)基数排序,是一种稳定的排序;

(3)时间复杂度,可以认为是线性的O(n);

原文地址:https://www.cnblogs.com/pcbren/p/9788836.html

时间: 2024-08-28 17:13:07

PCB 挺有意思的基数排序----C#代码实现的相关文章

挺有意思的人体时钟代码(转自http://ziren.org/tools/hone-hone-clock.html)

透明底<script charset="Shift_JIS" src="http://chabudai.sakura.ne.jp/blogparts/honehoneclock/honehone_clock_tr.js"></script>白底<script charset="Shift_JIS" src="http://chabudai.sakura.ne.jp/blogparts/honehoneclo

一个挺有意思的Java技术讨论

为什么Java中1000==1000为false而100==100为true? 这是一个挺有意思的讨论话题. 如果你运行下面的代码: 基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的.如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同. 因此,后面一条语句也应该是false . 这就是它有趣的地方了.如果你看去看 Integer.Java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象.

现在觉得IT还挺有意思

前两天刚刚接触编程,用的是C#.开始确实枯燥,但是今天的感觉就好多了,还挺有意思.根据老师讲的课程自己编写了小程序,运行起来还不错.在这里分享下. 关于时间安排的小程序: int sj; int aa; string noon; string jg; Console.WriteLine("我是时间小助手"); Console.WriteLine("当前时间是:"); sj = Convert.ToInt32(Console.ReadLine()); noon = s

豌豆荚登船测试挺有意思~~

今天玩了下豌豆荚的登船测试,还是蛮有意思滴哒~~ 总结啦下就是调试工具的熟练使用啦 进入测试: 第一关: 看了下页面没有任何点击的地方就打开了调试工具,找了下elements,很轻松的找到哒 点击链接进入第二关 第二关: 第二关的密码也是藏在elements中啦,就是密码有点长,刚开始自己输的还输错了,导致落水哒~~(>_<)~~,复制粘贴哒下好啦 输入密码进入第三关 第三关: 第三关的稍微比较难找哒,不过仔细点就找到啦 将后面的step4到后面的输入浏览器即可进入第四关 第四关: 第四关很简

有意思的一段代码

有意思的一段代码: 1 %%% Message passing utility. 2 %%% User interface: 3 %%% logon(Name) 4 %%% One user at a time can log in from each Erlang node in the 5 %%% system messenger: and choose a suitable Name. If the Name 6 %%% is already logged in at another no

网易工作经验,这篇博文挺有意思的

看到一网友发的网易工作经验,感觉挺有意思的,整理如下: 1.先做人,后做事;对事不对人. 人品做好了,自然好办事,事情出问题了,不要针对某人,应当分析问题,找出原因,在事后总结.防范,真相出来来,该承担的就承担. 2.高效工作 产品开发的时候,一般都有产品人员,开发人员,每天规定好产品人员bug反馈时间,没有一天到晚都要即使聊天沟通,毕竟你还得工作,可以制定反馈时间,有节制地沟通. 3.20%核心为基础,80%的投入时间 如果做为一个项目主要负责人,要抓大放小,把控20%的核心架构,剩余的让伙伴

挺有意思的一个bug

偶遇一奇怪的bug,型如$("tt").html("<div>"+0||Math.floor(Math.random()*100))+"</div>") 这个东西出现一个截取问题,看起来挺长的,实际上结果只有$("tt").html("<div>"+0)的结果,后面被截取了,想了半天有点云里雾里的,其实这就是一个细节的问题,或运算有个特点,是只要前部分为true结果就为t

今天早上 “百度知道”有人提问 正则 ,看着挺有意思的写了一个,写好后还没有回复,楼主就关闭了,哈哈自己好慢呀

在html中,<div style="text-align: center; margin-top: 20px;"><img src="sdsd.jpg" /> <a href="http://www.sdfs.com" target="_blank"> <img src="sdsd.gif" /> </a></div><div

java基数排序算法代码下载

原文:java基数排序算法代码下载 代码下载地址:http://www.zuidaima.com/share/1550463272684544.htm 基数排序:基数排序可以说是扩展了的桶式排序, * 比如当待排序列在一个很大的范围内,比如0到999999内,那么用桶式排序是很浪费空间的. * 而基数排序把每个排序码拆成由d个排序码,比如任何一个6位数(不满六位前面补0)拆成6个排序码, * 分别是个位的,十位的,百位的.... * 排序时,分6次完成,每次按第i个排序码来排. * 一般有两种方