中国人发明的一种迄今最简单的排序算法—张仰彪排序法问世了! 请各路高手前来评判
张仰彪排序法
—中国人发明的迄今最简单的排序算法问世
对于大多数初学者来说,排序算法是比较难懂、不易掌握的,即使是最简单的冒泡排序,也要下些功夫才能学会,而且学会了很容易忘记。对此,本文提出了一种全新的排序算法,它与人们在日常生活中遇到排序问题时所采用的思维方式很接近,因此非常容易理解,与现有的各种排序方法相比,它可以说是一种最简单易懂的排序法,这就是以其发明者的名字命名的“张仰彪排序法”。
这种新式的排序算法采用了“英雄排座次”的计算方法:首先,声明一个与待排序数组大小相同的结果数组准备存放排好序的数据,然后通过一个两层的嵌套for循环,将待排序数组里的每一个数据都依次与数组中所有的数据(包括自己)相比较,最后获得每个数据按照大小在待排序数组里的排名,这个排名就是它们最终将在结果数组里的位置,最后将待排序数组里的数据按照它们各自计算出的排名复制到结果数组的相应位置上,排序完毕。
当待排序数组里存在重复数据时,情况就有些复杂了。因为对于重复的数据,它们经过计算后的排名是相同的,这样当按照它们的排名把它们向结果数组里复制时,它们都将被复制到结果数组里的同一个位置上,从而得到错误的结果数组。
为了解决这个问题,张仰彪排序法采用了一个简单的while循环:当把一个数据(设为a)按照它的大小排名向结果数组里复制时,首先判断目标位置上是否非0,若非0说明此位置已经有拷入了一个数据(且必与a大小相同),就把数据a的排名加一,去找下一个位置;依次类推,直到找到一个“空”位置,将数据a复制进去。这样做并不用担心数据a在向后递延自己的排名时会占用了错误的位置而导致出错,因为假设待排序数组有三个值相同的数据(设为a1、a2、a3),由于结果数组与待排序数组等长,这三个相同的数据最终在结果数组里的位置必然也是相邻的某三个位置,它们最终必然先后拷入这三个相邻的位置上。
凡事有利必有弊,张仰彪排序法虽极其简单易懂,但它也存在不足,主要是占用内存大、运算效率较低,对于处理大量数据是不利的,但当数据量不大时它是很不错的一种排序算法,特别是当这些待排序的数据数量不大而且不存在重复数据时,张仰彪排序法的简单易懂的优势就更明显了;例如企业中员工ID号的排序、大学里学生学号以及考试课程号的排序等等。
笔者曾经开发过一个模拟彩票的游戏软件,程序中需要对彩票上的7个随机产生的号码进行排序,由于待排序数据很少,所以采用了张仰彪排序法,结果证明非常有效,整个程序由于采用了这个中国人最新发明的独特的排序法而显的熠熠生辉。
排序算法令人望而生畏的时代结术了。
下面给出用Java语言编写的张仰彪排序法的代码:
Public int [] SortProcedure ( int [] x )
{
int [] y=new int [ x.length ]; //存放排序结果的数组,与待排序数组等长。
int DataOrder=0; //存放待排序数据在数组里的排名的变量。
for ( int i=0;i < x.length;i ++ )
{
for ( int t=0;t < x.length;t ++ )
{
if ( x[t] > x[i] ) //待排序数组中的一个数据与其余数据相比较。
DataOrder ++; //每发现一个更大的数,自己的排名就向后延。
} //内循环运行一次,一个待排序数据在数组里的大小排名就确定了。
while ( y[DataOrder] !=0 ) //非0说明此位置已拷入过的数据。
DataOrder ++; //增大数据的排名,去找下一个位置。
y [DataOrder]=x [i]; //将待排序数据x[i]复制到结果数组y。
DataOrder=0; //排完一个数据,准备再排下一个。
}
return y;
}
此排序算法的价值究竟如何,欢迎诸位高手对此发表高见。