说到排序,可能你能说出一大堆,什么冒泡,快速,插入,希尔...说实话,我能轻易写出那些算法,但是总觉得没有什么意义,人的脑子里净装一些书上的东 西,还不如去当图书馆管理员呢?于是我就从最简单的排序算法开始自己实现一个书上没有的,也可能书上有只是我没有看到罢了,不管怎么说,练练。这个算法可能时间复杂度很高,也可能空间复杂度使得根本不值得用,也可能有漏洞,但是有什么关系呢?我又不是大师,只当娱乐了。说到排序,办法无非就是比较,一个一 个数比较,算法的优劣只是比较时的技巧不同,只要比较就有竞争,有竞争就有胜利者,比较和比赛在这个意义上是相同的,程序设计者要时刻关注人世间发生的每一件事,这是我的信条。
就说赛跑这种比赛吧,大家在同一起跑线,然后发令枪一响,所有参赛者同时起跑,谁第一个到达终点就是第一名,然后第二名,第三名,顺序就这么排好了,如果在排序算法中也这么干可不可以呢?几个要排序的数同时开始比较,同时“起跑”,不用它们之间一一比较,而是存在一个统一的对大家都公平的“终点线”,以它 们越过终点线的顺序为最终顺序。当然可以了,把奔跑抽象成移位,把终点线抽象成确定的位不就可以了吗?实际上就是这样的,我们使所有参与排序的数字同时向右移位,比如排序32位整数,我们把终点线设置为0XFFFFFFFE,就是第32位为1,其余低位都是0,然后让所有数一位一位向右移,谁第一个和终点线“与”操作后不为0就说明它首先有为1的位移到了第32位,那么它就是最大的数。如果有很多数都同样的移动到了最右边并且和终点线“与”操作不为0,那 么就说明需要对它们“加赛”,办法和前面比赛相同,只是不再从头开始移位了,而是从它们相等的位的下一位再开始,直到区分出胜负或者移完了整个32位。
上述方法在逻辑上很简单,也很合理,但是软件实现上要达到高效和谐却有很大困难,毕竟冯诺依曼机器不是并行机,它很擅长一步一步做事,而不擅长大家一起来,要想高效实现上述赛跑模型,我觉得用向量机更合适,在我们的标量机上,加上时间不充裕,我也只能做出一个拙劣低效的实现。其实移位是一个很重要的运 算,一些机器上的CRC校验就是用移位进行运算的,和上面的赛跑模型差不多,移位排序用硬件实现效率要高得多,毕竟那是硬件的强项,硬件只认识“位”。在 软件上,只能说可以实现,因为硬件能实现的过程通过软件都可以模拟,重点就是认识到运算逻辑,然后写出程序。下面给出我的实现(java版本):
/*
*iMaxTypeLength--要排序的数据类型的长度
*iDataLength
本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273521