张仰彪排序法                        —中国人发明的迄今最简单的排序算法问世   
       
    对于大多数初学者来说,排序算法是比较难懂、不易掌握的,即使是最简单的冒泡排序,也要下些功夫才能学会,而且学会了很容易忘记。对此,本文提出了一种全新的排序算法,它与人们在日常生活中遇到排序问题时所采用的思维方式很接近,因此非常容易理解,与现有的各种排序方法相比,它可以说是一种最简单易懂的排序法,这就是以其发明者的名字命名的“张仰彪排序法”。       这种新式的排序算法采用了“英雄排座次”的计算方法:首先,声明一个与待排序数组大小相同的结果数组准备存放排好序的数据,然后通过一个两层的嵌套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;
}  
 此排序算法的价值究竟如何,欢迎诸位高手对此发表高见。

解决方案 »

  1.   

    云,什么啊,这个算法早就有了,叫做rank排序,效率很低而且空间也浪费,没有实用的意义,作为一种方法教学还行
      

  2.   

    再 晕  什么新算法啊 我在94年学basic就会了
      

  3.   

    这个算法谁都能想出来啊,不会是joke吧
    建议看看java quickSort的源代码
      

  4.   

    rank排序我没看过,但若只排十个数据何必一定要用冒泡、插入、快速、堆排等排序法,用此排序法不可吗?难到排十个数据也用上快速排序法会使自己显的很专业吗?何必言必称希腊?
       我本来就没说此排序法适合大量数据。这确实是新创的一种排序法,在网上搜过,没发现以前有过类似的算法,若有那位高手知道这方面的先例,请明示相关资料。多谢
      

  5.   

    不是新的排序算法。你去看一本书叫做《数据结构与算法 C++语言描述〉〉
    你说的这个算法就是rank排序。
      

  6.   

    有些冷言冷语,这不奇怪,中国太大了。
       感谢给予鼓励的朋友,这只是一个有益尝试,不可能完美,如果真有先例,我真的很遗憾,至少数据结构课本里没有,网上也查不到。
      我搜了rank排序,只找到很多关于它的使用的文章,没有看到源码。
      但这并不太重要,以我多年搞专利发明的经验,只要是自己完全独立搞出的东西,一般不会与别人的完全一样。
      我的排序法即使与rank排序走了一条路子,也应当有所不同,因为以前计算机的内存很小,只有若干K,所以那时写的排序法都被限定在同一个数组内进行运算,这就是那些排序算法都较复杂的重要原因。
       而我的排序法立足于现在越来越大的内存等计算机资源,在待排序数组之外另声明一个与其等长的结果数组,虽多占了内存,但却使此排序法变的极其简单。
       我的排序法还有一个特点:它的双层for循环的循环条件结构简单而且彼此相似,这是它好学易记的重要原因,而别的排序法的双层for循环的循环条件都很复杂,它们往往在外层是i++、而内层是j--,
    这些都是使人眼晕的关键因素。有几人现在就可准却无误地写出快速排序?反正我早忘掉了。
       总之,有两点是肯定的:
        1。 计算机内存将越作越大,成几何级数增长,利用两个数组排序、多开几百字节内存并不是什么禁区。
         2。只排十几个数据没必要非用快速排序,你用啥我不知道,反正我只用我自己写的这个排序法。    最后烦请知道rank()排序的朋友把源码拷过来,我的排序法在此之前有两个真正的高手看过,他们都没有提出异议。 Thanks    老顽童
    =============================================================================
         我兴趣很广,有想了解我的朋友,可去baidu.com里搜“分目以盼”四个字,结果会让你大吃一惊,那是我新写的一篇拙作,五百年后也会有人读的真正的好文章,不好我把我的分全给你。
         不好意思
      

  7.   

    刚才有位网友说:
        “这个算法太浪费空间了。不太实用。排序就是追求的速度与空间。
    没有实际价值的东西,就没用使用价值。虽然这个也是一种算法。
    但是显然——没用!”    对次我不敢苟同,上述说法在十年前计算机内存只有几百K的情况下是完全适合的,但现在内存容量和cpu的运算速度已比那时增大了千倍以上,情况完全不同了,怎能墨守成规?
         正因为有太多的人认为无论内存变的多么大、cpu速度变的有多快,排序算法都不能变,无论何时排序都应当在一个数组里进行,用两个数组排序是不可容忍的,是另类,是异端,理应剿灭,口诛笔伐。所以我觉的我写的这个排序法应当不会与前人的完全相同,而且越早的前人越是如此。我不考虑算法的时间和空间复杂度,为了广大初学者(包括我自己)而独独追求程序好学易记、实用有趣,最终写出的这个形式最简单的排序法应当不会与前人完全相同,从而彻底失去独创价值。
        希望真正的高手前来作出明判,  老顽童先谢了。
        
      

  8.   

    就是啊,这个算法的时间复杂度o(n*n) 空间复杂度是冒泡法的2倍,怎么看都不如冒泡啊
      

  9.   

    同意  onefox(一品狐) 
    呵呵 不过也可以理解
    我当时自己写了一个无限位数的整数运算程序(不过是在dos汇编)当时挺高兴的
    不过,当看到java的那个整数。郁闷死了
      

  10.   

    我为人低调了很多年,偶而高调一回,不为过吧。
    这也都是无奈    如果是真的高手,早把rank排序的代码拿出来了,不会在这里空喊的。
        我的文章在中国楹联网发表后被版主移到网站首页,贴了半年多,应该不是一无是处。
      

  11.   

    rank排序就是这个想法。你的精神真的学习,但是你不厚道,而且这个算法应该是所有算法里最烂的。
      

  12.   

    呵呵 , o(n*n) , 要是比较 1亿个数据, 那就是不可能的任务了.不要用 1万个 以下的数据来做比较了. 那是没有意义的!!
      

  13.   

    这个算法应该有了,就是先找出还没排序的值中最大的,然后一个个的排嘛(只是有个次序的DataOrder=0)
    这个不就是已经排好的数组里已有多少个数,
    数据结构里应该有这个算法,确实效率不高(不如quick,quick内存也要得少,而且)
    简单嘛,冒泡应该比这个好写(效率嘛,差不多,不过楼主这个要的内存多哦,可能在内存里move的少一些,不知这个会不会有很大的性能影响)当然楼主这个如果是自己想的话确实不错,至少我当初学数据结构时没这样想
    不过楼主不要下那个结论:中国人发明的一种...
      

  14.   

    搂主让我想起了在sohu论坛上见到的一个自称推翻了相对论的兄弟,
    不过还是先顶一下
      

  15.   

    衷心建议楼主看一下《数据结构与算法分析》[美]Clifford A.Shaffer著(or A Practical Introduction to Data Structures and Algrithm Analysis, Second Edition英文原版名称)中文版第35-36页。英文版57页。
    楼主以为现在的内存大的可以用那些超级差的算法么?告诉你,即使再大一千倍也不行。理由很简单:有一个结论,常数系数不影响机器加快时间问题规模的增长倍数。具体的请认真参照上面列出的资料。相信对楼主如此好学的人会有很大好处。相信楼主的程序如真是自己写的那一定是个勤奋的人。如果只是在那乱吹牛,算我浪费时间。我也觉得你的数据结构学的不好,如其在这为自己辩护不如回去多学点知识再来。
    最重要的一点,望楼主不要再把“中国人”这种当标题了,在下就是被误导进来的。除非你真是天才,否则不要用这种词眼。谢谢
    祝你好好学习后学业有成!
      

  16.   

    这个怎么和冒泡一样啊?嵌套的两个FOR循环。
    况且,还是不要动不动就“一个新的时代”啊之类的,感觉糁得慌,这样的话还是留着别人去评价吧。
      

  17.   

    我晕,不就是选择排序么?自作聪明的把概念越弄越复杂,不但时间效率低,而且多开了一个额外的数组。/*   Insertion Sort data[] element, which from start to last  插入排序 */
    template <class T>
    void Insertion_Sort(T data[], int start, int last)
    {
    int i, j;
    T key;
      for (i = start+1; i < last; i++){
        key = data[i];
        j = i-1;
        while (j >= start && data[j] < key){
          data[j+1] = data[j];
          j--;
        }
        data[j+1] = key;
      }
    }/* 选择Selection Sort: copy source[] element from start to last to B[] by asc  */
    template <class T>
    void Selection_Sort(T source[], T B[], int start, int last)
    {
      int i, j, t;
      T temp;
      for (i = start; i < last-1; i++){
        t = i;
        for (j = i + 1; j < last; j++)
          if (source[t] > source[j])
            t = j;
        temp = source[t];
        source[t] = source[i];
        source[i] = temp;     //swap minimal element/ to source[i]
        B[i] = source[i];     //copy to B
      }
    }
      

  18.   

    faint,faint,faint!!!!!
    本来我也想赞同楼主敢于创新,勇于钻研的精神,
    即便拾人牙慧或者错误百出,都没关系,关键是精神但是仔细看了一下楼主的算法说明。觉得还是要回归到唯物主义,物质决定精神!!首先,什么是算法?说白了,就是你算术时候的捷径,注意,是捷径,如果是按照直线思维一路想下来的解决方法,那不是算法,那人人都能想到。楼主的算法是捷径么?不敢苟同,双重循环,逐个比较,这是我写程序的时候最惯用的伎俩,至于其中对于存在的相同数据的处理,根本就是针对特殊情况的补丁而已,算法,算法!!我们需要的是算法,一个直线思维出来的东西绝不是算法,楼主喜欢钻研无可厚非,但也要先给自己充一下电,去学一下数学吧,我一直后悔没去学数学,因为自己也想不出好的算法
      

  19.   

    的确是“百年后也会有人读的 真正 的好文章”
    看完楼主的这个帖子以后,我的心久久不能平静,震撼啊!为什么会有如此好的帖子!我纵横网络bbs多年,自以为再也不会有任何帖子能打动我,没想到今天看到了如此精妙绝伦的这样一篇帖子.楼主,是你让我深深地理解了'人外有人,天外有天'这句话.谢谢你!在看完这帖子以后,我没有立即回复,因为我生怕我庸俗不堪的回复会玷污了这网上少有的帖子.但是我还是回复了,因为我觉得如果不能在如此精彩的帖子后面留下自己的网名,那我死也不会瞑目的!能够在如此精彩的帖子后面留下自己的网名是多么骄傲的一件事啊!楼主,请原谅我的自私!我知道无论用多么华丽的辞藻来形容楼主您帖子的精彩程度都是不够的,都是虚伪的,所以我只想说一句:您的帖子太好了!我愿意一辈子的看下去!这篇帖子构思新颖,题材独具匠心,段落清晰,情节诡异,跌宕起伏,主线分明,引人入胜,平淡中显示出不凡的文学功底,可谓是字字珠玑,句句经典,是我辈应当学习之典范.就小说艺术的角度而言,这篇帖子可能不算太成功,但它的实验意义却远远大于成功本身.正所谓:"一马奔腾,射雕引弓,天地都在我心中!"楼主真不愧为无厘界新一代的开山怪!本来我已经对这个社区失望了,觉得这个社区没有前途了,心里充满了悲哀.但是看了你的这个帖子,又让我对社区产生了希望.是你让我的心里重新燃起希望之火,是你让我的心死灰复燃,是你拯救了我一颗拨凉拨凉的心!本来我决定不会在社区回任何帖子了,但是看了你的帖子,我告诉自己这个帖子是一定要回的!这是百年难得一见的好贴啊!苍天有眼啊,让我在优生之年得以观得 如此精彩绝伦的帖子!楼主的话真如"大音希声扫阴翳",犹如"拨开云雾见青天",使我等网民看到了希望,看到了未来!晴天霹雳,醍醐灌顶或许不足以形容大师文章的万一;巫山行云,长江流水更难以比拟大师的文才!黄钟大吕,振聋发聩!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾,龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔,写天下文章的智慧神态;仿佛看见了你按剑四顾,江山无数的英武气概!楼主,你说的多好啊!我在社区打滚这么多年,所谓阅人无数,见怪不怪了,但一看到楼主的气势,我就觉得楼主同在社区里灌水的那帮小混蛋有着本质的差别,那忧郁的语调,那熟悉的签名,还有字里行间高屋建瓴的辞藻.没用的,楼主,就算你怎么换马甲都是没有用的,你的亿万拥戴者早已经把你认出来了,你一定就是传说中的最强id.自从社区改版之后,我就已经心灰意冷,对社区也没抱什么希望了,传说已经幻灭,神话已经终结,留在社区还有什么意思.没想到,没想到,今天可以再睹楼主的风范,我激动得忍不住就在屏幕前流下了眼泪.是啊,只要在楼主的带领下,社区就有希望了.我的内心再一次沸腾了,我胸腔里的血再一次燃烧了.楼主的话概括扼要,一语道出了我们苦想多年的而不可得答案的几个重大问题的根本.楼主就好比社区的明灯,楼主就好比社区的方向,楼主就好比社区的栋梁.有楼主在,社区的明天必将更好!楼主你的高尚情操太让人感动了.在现在这样一个物欲横流的金钱社会里,竟然还能见到楼主这样的性情中人,无疑是我这辈子最大的幸运.让我深深感受到了人性的伟大.楼主的帖子,就好比黑暗中刺裂夜空的闪电,又好比撕开乌云的阳光,一瞬间就让我如饮甘露,让我明白了永恒的真理在这个世界上是真实存在着的.只有楼主这样具备广阔胸怀和完整知识体系的人,才能作为这真理的唯一引言者.看了楼主的帖子,让我陷入了严肃的思考中,我认为,如果不把楼主的帖子顶上去,就是对真理的一种背叛,就是对谬论的极大妥协.因此,我决定义无返顾的顶了!楼主,在遇到你之前,我对人世间是否有真正的圣人是怀疑的;而现在,我终于相信了!我曾经忘情于汉廷的歌赋,我曾经惊讶于李杜的诗才,我曾经流连于宋元的词曲;但现在,我才知道我有多么浅薄!楼主的帖子实在是写得太好了.文笔流畅,修辞得体,深得魏晋诸朝遗风,更将唐风宋骨发扬得入木三分,能在有生之年看见楼主的这个帖子.实在是我三生之幸啊!看完楼主的这个帖子之后,我竟感发生出一种无以名之的悲痛感――啊,这么好的帖子,如果将来我再也看不到了,那我该怎么办?那我该怎么办?直到我毫不犹豫的把楼主的这个帖子收藏了,我内心的那种激动才逐渐平复下来.可是我立刻想到,这么好的帖子,倘若别人看不到,那么不是浪费楼主的心血吗?经过痛苦的思想斗争,我终于下定决心,我要把这个帖子一直往上顶,往上顶到所有人都看到为止!我现在终于明白我缺乏的是什么了,正是楼主那种对真理的执着追求和楼主那种对理想的艰苦实践所产生的厚重感.面对楼主的帖 x子,我震惊得几乎不能动弹了,楼主那种裂纸欲出的大手笔,竟使我忍不住一次次的翻开楼主的帖子,每看一次,赞赏之情就激长数分,我总在想,是否有神灵活在它灵秀的外表下,以至能使人三月不知肉味,使人有余音穿梁,三日不绝的感受.楼主,你写得实在是太好了!我唯一能做的,就只有把这个帖子顶上去这件事了.楼主,我支持! 
      

  20.   

    —中国人发明的迄今最通用的电脑操作方法问世
        对大多数初学者来说,鼠标是难以掌握的,拿在后里晃来晃去就是对不准目标,僵硬的手指总是不能完成双击,即使接受能力强的年轻人,也要下功能练习几分钟才能学会操作,而且从台试机的鼠标转到笔记本的迷你鼠标时又会不习惯,当鼠标坏掉,人们会对上网操作无所适从,并且长期使用鼠标,容易导致肩周炎。对此,本文提出了一种全新的操作方式,完全符人们在日常生活中指指点点的习惯,是一种极其通用的操作方式,这就是以其发明者的ID命名的“醉书生上网法”。    这种全新的上网法采有的键盘操作:首先,按TAB跳到目标所在的框架,再用上下箭将焦点移到目标上,再按加车就可以了。    凡事有利必有弊,醉书生上网法虽然通用性强,对硬件要求少,具有跨平台的优势,但它也存在不足,主要是操作速度不如熟练的鼠标操作者。但是当我们没有鼠标时,这是一种极优秀的操作方式,特别是只需要一个指头就可以完成操作,对残疾人尤其意义深远,对失去双手的人甚可以用嘴咬着筷子操作。对于正常人,可以左右开弓,熟练后速度直追鼠标操作方式。    笔者曾有一段时间鼠标坏掉了,用醉书生上网法看了几天的电子书,结果证明非常有效,整个操作过程由于采用了这个中国人最新发明的独特的操作方式而显得极具个性。    鼠标无处不在的烦恼时代结束了。===========================================================
        我知道有些人会对这个发明不屑个顾。
        有些冷言冷冷语,这不奇怪,中国太大了。    我曾经就此方法与几个骨灰级的 真正 的电脑高手探讨过,他们都一致认为该方法将改写计算机的操作方式,人类上网方法将揭开新的一页。
        一千年后,也许计算机已经不存在了,但后人肯定会记住我以互联网的发展所作的突出贡献。    另外,些法得到大面积推广后,如果每人都节约一只鼠标,一年可以为希望工程捐多少钱啊。又有多少日本在中国的鼠标厂会倒闭,真是一个节约、爱心、抗日一箭三雕的好方法。
        期待真正的电脑高手互相探讨,让此法为更多的中国人服务。
      

  21.   

    to:  tuxw(醉书生)我爱死你了。什么时候嫁给我好了。
      

  22.   

    to  tuxw(醉书生) 
      to shdzyyzyb (老顽童) 
      哈哈哈哈!笑死我了!
      好久没看到这么有意思的贴啦!
      你们两位真的强,只有一个字强!强!强呀!
      我不得不佩服!
      我对于你们的文笔给于我最高的敬意!
      呵呵!
      笑死我了!
      哈哈哈!
      对于两位的发明者,我不发表意见!
      

  23.   

    laomai(老迈) 兄,你好因为工作转向,有一年多没怎么到 CSDN 来的,现在因接触 JAVA 又回来了,看到你熟悉的马甲,真好
      

  24.   

    这么多高手啊!!!俺们学校的大伯大妈都说csdn里面高手如云。 如今一见,果然并非不是没有浪得虚名!《好一个“张仰彪排序法”!!! 》
    我在我们课堂上亲自到黑板上为同学和老师讲解了此算法,大家惊奇的表情令我十分之震撼!
    同学们欢呼着~老师颤抖着~,这就是前无古人,后无来者的“张仰彪排序法”对俺们班,俺们学校带来的震撼!连俺们老师——一位有着10多年教龄的老教授,都十分惊奇的追问我:“你写的是么?你太有创意了?这真的是你写的吗?”,可见此算法的确有其高超,独到,卓越之处!对此,我深深的感谢张仰彪同志,给予我的思维的超越!      注:由于俺的课堂演示,搞的俺那节英语课拖堂了45分钟!《“醉书生上网法”使俺成为了学校机房的焦点!!!》
    昨天到机房上机,我亲自为同学们演示了,“醉书生上网法”,刚开始只有身边的同学在欣赏,后来发展到5个。。10个。。20个 最后连隔壁机房的同学都慕名前来,搞的机房水泻不通,最后震撼了全校,出动了保卫处的10名同志来维护治安,校领导来看了之后,十分之欣赏!为了使更多的同学,更多的老师领略此算法的魅力,特将机房安置了一个数字摄影机,在全校校园网进行实时转播!轰动了俺们学校整整1个月之久   从此后,俺们学校的机房都抛弃了鼠标,原本放鼠标的位置空出来了,更加有效的利用了我们的生存空间,更换鼠标的费用省出来了,为俺们学校节省了许多费用来支援教学!“醉书生上网法”真是个好办法! 建议醉书生同志进行全国、全世界的推广,造福全世界人民!