中国人发明的一种迄今最简单的排序算法—张仰彪排序法问世了! 请各路高手前来评判

shdzyyzyb 2005-04-16 10:14:41
张仰彪排序法

—中国人发明的迄今最简单的排序算法问世

对于大多数初学者来说,排序算法是比较难懂、不易掌握的,即使是最简单的冒泡排序,也要下些功夫才能学会,而且学会了很容易忘记。对此,本文提出了一种全新的排序算法,它与人们在日常生活中遇到排序问题时所采用的思维方式很接近,因此非常容易理解,与现有的各种排序方法相比,它可以说是一种最简单易懂的排序法,这就是以其发明者的名字命名的“张仰彪排序法”。

这种新式的排序算法采用了“英雄排座次”的计算方法:首先,声明一个与待排序数组大小相同的结果数组准备存放排好序的数据,然后通过一个两层的嵌套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;
}


此排序算法的价值究竟如何,欢迎诸位高手对此发表高见。




...全文
10359 420 打赏 收藏 转发到动态 举报
写回复
用AI写文章
420 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerrylovejava 2005-08-21
  • 打赏
  • 举报
回复
呵呵,很久没来看看了,居然有这么意识的事情去!!!!
tuxw 2005-08-20
  • 打赏
  • 举报
回复
To humucun(木孤孤木):

说明一下,那段文采极佳的马屁顶不是我原创的
din1001 2005-08-20
  • 打赏
  • 举报
回复
原来楼主就是传说中的xx,比芙蓉姐姐出道还早啊!!:)强啊
随风来去 2005-08-19
  • 打赏
  • 举报
回复
mark一下
aaaasssdd 2005-08-19
  • 打赏
  • 举报
回复
曾经来过
CatLuDn 2005-08-18
  • 打赏
  • 举报
回复
2年来头一天回CSDN就遇此强贴,留影!留影。
imageboy2004 2005-08-17
  • 打赏
  • 举报
回复
412回复,什么时候能有412个人帮我解决问题我就要高兴的疯掉了.
lovecprogram 2005-08-17
  • 打赏
  • 举报
回复
都不知道说什么好...汗
DJadeChow 2005-08-17
  • 打赏
  • 举报
回复
看看时间和空间复杂度再说
SInoyew 2005-08-17
  • 打赏
  • 举报
回复
呵呵,各有各的生活调。
楼主的方式只是奇怪而已,无它吧!
ffansky 2005-08-17
  • 打赏
  • 举报
回复
这个算法大学课本里是没有 你们就放过他吧
阿弥陀佛。。。。
sbxlj 2005-08-17
  • 打赏
  • 举报
回复
吐血,这个贴子真TMD长.
同意 谁的屁股在飞:
自己想出来的就是好的~
别人的东西再怎么好再怎么多都是别人的
贝壳鱼 2005-08-16
  • 打赏
  • 举报
回复
强贴留名
Geranium 2005-08-16
  • 打赏
  • 举报
回复
友情支持楼主一把~
xiaosa01 2005-08-16
  • 打赏
  • 举报
回复
我写过的两种排序法:
1.
int[] sort(int[] data) {
if (data == null) return null;
for (int i=0; i<data.length-1; i++) {
for (j=i; j<data.length-1; j++) {
if (data[j] < data[j+1]) {
int temp= data[j];
data[j] = data[j+1];
data[j+1] = temp;
}
}
}
return data;
}
2.
int[] sort(int[] data) {
if (data == null) return null;
for (int i=0; i<data.length-1; i++) {
for (j=i; j>=0; j--) {
if (data[j] < data[j+1]) {
int temp= data[j];
data[j] = data[j+1];
data[j+1] = temp;
}
}
}
return data;
}

大家看出排序方法了吗?
方法一每一次全部元素都进行循环
方法二先前两个比较,然后是三个比较,然后是四个,依次类推。
wscft 2005-08-16
  • 打赏
  • 举报
回复
搞笑, 不谈楼主的算法怎么, 大家都心知肚明的, 单就楼主的勇气就可嘉!(帖出这么强的帖子)
wenchaohu213 2005-08-16
  • 打赏
  • 举报
回复
你在策划和勇气方面的却是有一定能力,

但是在心态上你现在很欠缺,

我如果是搞产品营销这类工作老板的话,我会用你但是不会重用你,
如果我是搞开发工作的老板的话,我绝对不会用你。
现在公司都是有企业文化的,估计你是比较难调教。

说了实话,不要见怪!
autowind 2005-08-16
  • 打赏
  • 举报
回复
比我还浮躁。
xiaoluoxy 2005-08-16
  • 打赏
  • 举报
回复
和芙蓉姐姐有一拼
cbrooks 2005-08-16
  • 打赏
  • 举报
回复
我是不会让这个帜子下去的!!!
支持国产!!!
加载更多回复(399)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧