public class TT {
public static void main(String[] args) {
    int MAX = 100000;
    int[] nums = new int[MAX];
    Random r = new Random(20080623);
    for (int i = 0; i < MAX; i++) {
      nums[i] = r.nextInt(MAX);
    }
    long begin = System.currentTimeMillis();//     sort_sagezk2(nums);
    sort_scf37(nums);
    long end = System.currentTimeMillis();
    System.out.println((end - begin)); 
      }
public static int[] sort_sagezk2(int[] nums) {
    final int LEN = nums.length;
    int i, j, t, p;
    int[] temp = new int[LEN];
    for (i = 0; i < LEN;) {
      temp[nums[i++]]++;
    }
    for (i = 0, p = 0; i < LEN; ++i) {
      if ((t = temp[i]) == 0)
        continue;
      for (j = 0; j < t; ++j) {
        nums[p++] = i;
      }
    }
    return nums;
  }
他们的算法俺看不懂 高手帮解释下
int[] arrays = {1,2,5,8,45,3,71,64};
我用上面的数组测试回报java.lang.ArrayIndexOutOfBoundsException 
求解
具体的那个帖子找不到了.....

解决方案 »

  1.   

    为啥都这么纠结于算法呢?????
    论坛就那么几个帖子,大部分都问xxx算法,进去一看都TM纯数学问题,我x
      

  2.   


    for (i = 0; i < LEN;) {
              temp[nums[i++]]++;
            }这句是干嘛?这里直接越界了
      

  3.   


    /**
     * 建立一新数组,以数组的下标表示原数组的值,以数组的值,表示这个数的个数:
     * 如下:num {0,2,2,1,5,4}
     * 通过遍历num生成新数组为
     *    temp{1,1,2,0,1,1} 
     *    表示:
     *    0:1个
     *    1:1个
     *    2:2个
     *    3:0个
     *    4:1个
     *    5:1个
     *  其实这时候排序已经完成,
     *  再遍历temp,从根据个数0,1,2,3,4,5中挑数,
     *  为
     *  0,1,2,2,4,5
     * 因为新数组的长度和原数组相同,
     * 代码中又用到了temp[nums[i++]]
     * 所以数组中的最大数不能大于nums.length-1或者temp的长度也可以定义了max(nums[i]),
     */