V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Adlered
V2EX  ›  程序员

继"睡眠排序"后, 我突发奇想写了个改良版的......

  •  1
     
  •   Adlered · 2019-02-26 01:07:54 +08:00 · 5153 次点击
    这是一个创建于 2096 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原理就是......
    从-99999 循环到 99999
    然后每循环一次, 在每次循环其中再遍历一次数组, 如果数组里含有这个数, 就打印出来......
    我是不是该吃药了? 效率还莫名的不错......
    不但支持负数, 还能自由修改排序范围......

    public class 智障排序 {
      public static void main(String[] args) {
       int[] nums = {1,4,2,5,3,9,123412,12,5112,126,-12};
        for (int i = -99999; i < 99999; i++) {
         for (int j:nums) {
         if (j == i)
          System.out.println(i);
        }
       }
      }
    }

    第 1 条附言  ·  2019-02-26 16:48:14 +08:00
    注:效率不错是相对睡眠排序来讲的~
    26 条回复    2019-02-26 17:48:03 +08:00
    Building
        1
    Building  
       2019-02-26 01:20:08 +08:00 via iPhone   ❤️ 1
    这个叫低配版冒泡排序。
    shawngao
        2
    shawngao  
       2019-02-26 01:22:19 +08:00
    是你赢了
    xujinkai
        3
    xujinkai  
       2019-02-26 01:43:08 +08:00 via Android   ❤️ 3
    你这不全面,万一超过范围呢。
    应该先遍历一遍,得到上下界,然后再循环。
    watzds
        4
    watzds  
       2019-02-26 01:43:12 +08:00 via Android
    就是鸽巢排序,桶排序的时间换空间版
    wbing
        5
    wbing  
       2019-02-26 06:10:54 +08:00 via iPhone   ❤️ 1
    测试用例,{INT_MAX,INT_MIN}
    Perry
        6
    Perry  
       2019-02-26 08:14:35 +08:00 via iPhone   ❤️ 3
    有小数就凉
    jzq526
        7
    jzq526  
       2019-02-26 08:54:48 +08:00
    大约循环 20 万次,还有比对,就为了给十几个数排序……貌似常见算法哪个都比这个效率高吧?
    你这个算法在数据量很大,相对比较集中的情况下可能会好一点
    binxin
        8
    binxin  
       2019-02-26 08:58:21 +08:00
    考虑一下位排序?
    好像是直接申请一个 20 万位长的二进制数
    Orenoid
        9
    Orenoid  
       2019-02-26 08:59:45 +08:00
    这不和桶排序差不多一个思路吗
    yosemite
        10
    yosemite  
       2019-02-26 09:07:16 +08:00
    @jzq526 这本来就是脑洞用的。要不睡眠排序不是更扯
    liunian1004
        11
    liunian1004  
       2019-02-26 09:41:18 +08:00 via iPhone   ❤️ 1
    还是喜欢指鹿为马排序
    fcten
        12
    fcten  
       2019-02-26 09:57:07 +08:00
    @jzq526 是 11*20 万次吧
    admol
        13
    admol  
       2019-02-26 09:57:40 +08:00
    就这个写法来说, 两个 for 循环换一下顺序, 打印之后再退出下当前循环, 效率是不是要高一点
    codehz
        14
    codehz  
       2019-02-26 10:03:54 +08:00 via Android
    说起来 gpu 上还真有这种操作(
    luomu24
        15
    luomu24  
       2019-02-26 10:19:17 +08:00
    应该把范围改成 -2^31~(2^31)-1,这样就适用于全部了。嘿嘿
    smeraldo
        16
    smeraldo  
       2019-02-26 10:50:59 +08:00
    小数怎么办?
    lithiumii
        17
    lithiumii  
       2019-02-26 10:59:34 +08:00
    还是斯大林排序好
    mingleizhen
        18
    mingleizhen  
       2019-02-26 11:04:05 +08:00
    for 确实是很快。。。
    pkokp8
        19
    pkokp8  
       2019-02-26 11:06:09 +08:00 via Android
    @Perry 乘所有数的分母乘积
    jmc891205
        20
    jmc891205  
       2019-02-26 11:23:26 +08:00
    你可能对效率不错有什么误解
    zzj0311
        21
    zzj0311  
       2019-02-26 14:00:50 +08:00 via Android
    你是怎么发现它效率不错的。。
    luckyx
        22
    luckyx  
       2019-02-26 14:30:23 +08:00
    比冒泡差多了吧... 实用性还不广
    tabris17
        23
    tabris17  
       2019-02-26 14:31:28 +08:00
    out of bound
    Kirscheis
        24
    Kirscheis  
       2019-02-26 14:39:39 +08:00 via Android
    你这样实现效率太低了,(max-min)*n 的时间。。不过可以用空间换时间变成基数排序,两次循环就可以

    for i in nums
    {
    arr[(uint64) i] = 1;
    }

    for i in len(arr)
    {
    if arr[i] == 1 print((int64) i);
    }

    时间是 n,不过最差可能需要 2^64 位的内存
    Adlered
        25
    Adlered  
    OP
       2019-02-26 16:47:38 +08:00
    @jzq526 哈哈哈 我的意思是相比较睡眠算法来讲效率要高得多~ 娱乐一下
    jzq526
        26
    jzq526  
       2019-02-26 17:48:03 +08:00
    @fcten 确实,我只看了外层循环就写回复了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5351 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 07:53 · PVG 15:53 · LAX 23:53 · JFK 02:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.