marginleft
V2EX  ›  问与答

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

  •  
  •   marginleft · Jul 9, 2015 · 4512 views
    This topic created in 4137 days ago, the information mentioned may be changed or developed.
    Supplement 1  ·  Jul 10, 2015
    感谢大家回复。
    我一开始也想用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 + ",");
    }
    }
    }
    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 replies  •  2015-07-10 13:23:38 +08:00
    sumhat
    sumhat
    Jul 9, 2015
    1
    先排个序再找 50 - 100 的就好了
    loveuqian
    loveuqian
    Jul 9, 2015 via iPhone
    2
    初学者只能想到先遍历找出再排序了
    batman2010
    batman2010
    Jul 9, 2015
    3
    最大堆。
    txx
    txx
    Jul 9, 2015
    4
    2000 直接做基数排序吧....
    chlx
    chlx
    Jul 9, 2015
    5
    如果不重复的话bit记录50-100. 最后按顺序输出. O(N).
    publicID001
    publicID001
    Jul 9, 2015 via Android
    6
    统计50-100 之间的所有数出现次数,输出

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

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

    然后查看下numArray从50到100项非零的。
    hahastudio
    hahastudio
    Jul 9, 2015
    17
    桶排啊,反正就 51 个位置
    cloud107202
    cloud107202
    Jul 9, 2015
    18
    桶排+1
    IwfWcf
    IwfWcf
    Jul 9, 2015
    19
    才 200 长度,怎么搞都可以啦……
    liuhaotian
    liuhaotian
    Jul 9, 2015 via iPhone
    20
    数组[50,100] x[M]++
    msg7086
    msg7086
    Jul 9, 2015
    21
    最容易实现的方法就是堆排序了吧。开个priority queue什么的然后一边判断一边插♂,跑完就能拿到结果了。
    lzdhlsc
    lzdhlsc
    Jul 10, 2015
    22
    桶排 O(n)
    initdrv
    initdrv
    Jul 10, 2015 via iPhone
    23
    身为一名默默无闻的JAVA新手,表示只能想到用Arrays的sort排序后,再用二分查找?分别得到不小于50和不大于100的角标?最后循环输出?😔😳
    poke707
    poke707
    Jul 10, 2015
    24
    LZ其实使用了twitter sort的一个变种
    https://github.com/ExPHAT/twitter-sort
    marginleft
    marginleft
    OP
    Jul 10, 2015
    25
    @poke707 为什么这么说呢?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3066 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 11:47 · PVG 19:47 · LAX 03:47 · JFK 06:47
    ♥ Do have faith in what you're doing.