给定一个 int 数组,长度 200,里面的元素是 0-2000 内的随机数。找出 50-100 之间的所有数,并排序。大家有什么思路? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
marginleft

给定一个 int 数组,长度 200,里面的元素是 0-2000 内的随机数。找出 50-100 之间的所有数,并排序。大家有什么思路?

  •  
  •   marginleft 2015 年 7 月 9 日 4003 次点击
    这是一个创建于 3937 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言    2015 年 7 月 10 日
    感谢大家回复。
    我一开始也想用bitset,来初始化一个长度是2000的数组。但是后来看到大家的初始化max-min=50个桶就能解决,感觉这确实是一个很好的方法,我用java写了一个demo:

    import java.util.Arrays;
    import java.util.Random;

    public class SortTest {
    public static void main(String[] args) {
    // 初始化
    int inputArrLength = 200;
    int maxValue = 2000;
    int min = 50, max = 100;

    int input[] = new int[inputArrLength];
    Random rand = new Random();
    System.out.println("input:");
    for (int i = 0; i < input.length; i++) {
    input[i] = rand.nextInt(maxValue);
    if (input[i] >= min && input[i] < max) {
    System.out.print(input[i] + ",");
    }
    }
    System.out.println();

    // bitset排序
    int bitset[] = new int[maxValue];
    Arrays.fill(bitset, 0);
    for (int i : input) {
    if (i >= min && i < max) {
    bitset[i]++;
    }
    }
    for (int i = 0; i < bitset.length; i++) {
    if (bitset[i] > 0) {
    for (int j = 0; j < bitset[i]; j++) {
    System.out.print(i + ",&qut;);
    }
    }
    }
    System.out.println();
    // 桶排序
    int bucket[] = new int[max - min];
    Arrays.fill(bucket, 0);
    for (int i : input) {
    if (i >= min && i < max) {
    bucket[i - min]++;
    }
    }
    for (int i = 0; i < bucket.length; i++) {
    if (bucket[i] > 0) {
    for (int j = 0; j < bucket[i]; j++) {
    System.out.print((i + min) + ",");
    }
    }
    }
    }
    }
    25 条回复    2015-07-10 13:23:38 +08:00
    sumhat
        1
    sumhat  
       2015 年 7 月 9 日
    先排个序再找 50 - 100 的就好了
    loveuqian
        2
    loveuqian  
       2015 年 7 月 9 日 via iPhone
    初学者只能想到先遍历找出再排序了
    batman2010
        3
    batman2010  
       2015 年 7 月 9 日
    最大堆。
    txx
        4
    txx  
       2015 年 7 月 9 日
    2000 直接做基数排序吧....
    chlx
        5
    chlx  
       2015 年 7 月 9 日
    如果不重复的话bit记录50-100. 最后按顺序输出. O(N).
    publicID001
        6
    publicID001  
       2015 年 7 月 9 日 via Android
    统计50-100 之间的所有数出现次数,输出

    另外这种数据规模就算暴力也没什么压力啊
    Kilerd
        7
    Kilerd  
       2015 年 7 月 9 日
    先sort,再用二分法找50和100,就可以了吧
    otakustay
        8
    otakustay  
       2015 年 7 月 9 日
    才200个数,显然开200个空位直接哈希排序了,冲撞就用开链表解决
    akira
        9
    akira  
       2015 年 7 月 9 日
    这个数据量,随便什么方法都可以了呀。
    先排序在过滤或者先过滤再排序都毫无压力的。
    而且排序直接冒泡都没问题呀
    also24
        10
    also24  
       2015 年 7 月 9 日
    我可以推荐一下Bogo排序嘛?
    scream7
        11
    scream7  
    PRO
       2015 年 7 月 9 日
    计数排序.
    18000rpm
        12
    18000rpm  
       2015 年 7 月 9 日 via Android
    想到快排,并且在每次分区的过程中遇到 50~100 之外的直接丢掉。
    leavic
        13
    leavic  
       2015 年 7 月 9 日
    @sumhat 运算量上讲,先查找再排序比较快吧。
    acros
        14
    acros  
       2015 年 7 月 9 日
    空间换时间吗?遍历一遍。

    声明一个200长度的数组numArray[200],memset一下。
    遍历一遍numArray[i]++,就得到所有数的排序表了
    acros
        15
    acros  
       2015 年 7 月 9 日
    上面数字说错了。等下我改改。
    acros
        16
    acros  
       2015 年 7 月 9 日
    numArray[2000];
    原数组遍历src[i],
    numArray[src[i]]++

    然后查看下numArray从50到100项非零的。
    hahastudio
        17
    hahastudio  
       2015 年 7 月 9 日
    桶排啊,反正就 51 个位置
    cloud107202
        18
    cloud107202  
       2015 年 7 月 9 日
    桶排+1
    IwfWcf
        19
    IwfWcf  
       2015 年 7 月 9 日
    才 200 长度,怎么搞都可以啦……
    liuhaotian
        20
    liuhaotian  
       2015 年 7 月 9 日 via iPhone
    数组[50,100] x[M]++
    msg7086
        21
    msg7086  
       2015 年 7 月 9 日
    最容易实现的方法就是堆排序了吧。开个priority queue什么的然后一边判断一边插♂,跑完就能拿到结果了。
    lzdhlsc
        22
    lzdhlsc  
       2015 年 7 月 10 日
    桶排 O(n)
    initdrv
        23
    initdrv  
       2015 年 7 月 10 日 via iPhone
    身为一名默默无闻的JAVA新手,表示只能想到用Arrays的sort排序后,再用二分查找?分别得到不小于50和不大于100的角标?最后循环输出?
    poke707
        24
    poke707  
       2015 年 7 月 10 日
    LZ其实使用了twitter sort的一个变种
    https://github.com/ExPHAT/twitter-sort
    marginleft
        25
    marginleft  
    OP
       2015 年 7 月 10 日
    @poke707 为什么这么说呢?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2828 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 69ms UTC 12:12 PVG 20:12 LAX 05:12 JFK 08:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86