【问题标题】:Bug help, Array out of bounds at high values错误帮助,高值时数组越界
【发布时间】:2014-03-10 22:42:59
【问题描述】:

当我使用这个中位数代码来查找 k 的给定位置时,我得到了一个超出范围的异常。我不确定它开始抛出错误的确切大小,但代码适用于大小

private static int mmQuickSortRecursive(Integer[] a, int k) {
    if (a.length <= 10)
    {
        Arrays.sort(a);
        return a[k-1];
    }
    int n = a.length;
    // partition L into subsets S[i] of five elements each (n/5 subsets).
    ArrayList<Integer[]> list = new ArrayList<Integer[]>();
    int cnt = 0;
    int m = n/5;
    for( int i = 0; i < m; i++ ) {
        Integer[] arr = new Integer[5];
        for( int j = 0; j < 5; j++ ) {
            if( cnt == n ) 
                break;
            arr[j] = a[cnt++];
        }
        Arrays.sort(arr);
        list.add(arr);
    }
    Integer[] x = new Integer[m];
    for (int i = 0; i< m; i++ ) {
        x[i] = list.get(i)[2];
    }
    int v = x[0];
    if(x.length > 2) {
                    ///////// ERROR THROWN ON BELOW LINE /////////////////
        v = (x.length%2 == 0)? x[x.length%2-1]: x[x.length/2];
    }
    //    partition L into 3 parts, L1<M, L2=M, L3>M
    Integer[] l = partition_left( a, v );
    Integer[] r = partition_right( a, v );
    if( k == l.length+1 ) {
        return v;
    } else if( k <= l.length ){
        return mmQuickSortRecursive(l,k);                               
    } else {
        return mmQuickSortRecursive(r,k-l.length-1);                            
    }       

}

【问题讨论】:

标签: java arrays sorting quicksort


【解决方案1】:
v = (x.length%2 == 0)? x[x.length%2-1]: x[x.length/2];

好像错了。不应该吗

v = (x.length%2 == 0)? x[x.length/2]: x[x.length/2-1];

【讨论】:

  • 那 (x.length / 2 - 1) 也可以是 -1 imho。
  • 这解决了大小问题,但是我在同一个数组上运行的另一个查找/排序方法不会响应该方法找到的 k 值。代码修复似乎在我正在寻找的 k 之后给出了 4-5 个值。
  • 我也看到了。我认为逻辑运算符是倒退的。
  • 总的来说,这不是一个大问题,如果它在 k 附近找到一个非常大的数组的值,这很好,因为找到它的时间几乎是相等的。我正在使用该方法收集大量时间数据,至少它不应该搞砸。
  • 是的,在运行数据几分钟后,它返回的值经常是正确的,它不应该扭曲我的数据。即使在某个地方还有另一个小错误,它也应该没问题。感谢您的帮助!
猜你喜欢
  • 2014-01-15
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多