-3

このアルゴリズムを本から直接コピーしていますが、「ERROR HERE !!!!」で ArrayIndexOutOfBoundsException が発生し続けます。一部... T[i] = ...

それは私を狂わせており、これを成し遂げる必要があります...誰かがこれを修正する方法を提案できますか? また、本からアルゴリズムを翻訳したために発生する可能性のある他のエラーについてもコメントしました...

仕事に向かいます。しばらくしてから戻ってきてください。助けていただければ幸いです..

public static int select(int n, int S[], int k)
    {
        return select4(S, 1, n, k);
    }

    public static int select4(int S[], int low, int high, int k)
    {
        int pivotpoint = (low+high)/2;  //the algorithm didn't define "pivotpoint", so I'm assuming I can use anything..
        if(high==low)
            return (S[low]);
        else {
            partition4(S, low, high, pivotpoint);
            if(k==pivotpoint)
                return(S[pivotpoint]);
            else if(k<pivotpoint)
                return(select4(S, low, pivotpoint-1, k));
            else
                return(select4(S, pivotpoint+1, high, k));
        }
    }

    public static void partition4(int S[], int low, int high, int pivotpoint)
    {
        int arraysize = high - low + 1;
        int r = (int)Math.ceil(arraysize/5);  //maybe error because not double?
        int i, j, mark=0, first, last;
        int pivotitem;
        int[] T = new int[r];
        int temp;

        for(i=1; i<=r; i++) {
            first = low + 5*i - 5;
            last = Math.min(low + 5*i - 1, arraysize);
            T[i] = S[(first+last)/2]; //Algorithm says "median of S[first] through S[last]"
//          ^ ERROR HERE!!!!!!!!!!!!
        }

        pivotitem = select(r, T, (int)Math.floor((r+1)/2)); //maybe error because not double?
        j = low;

        for(i=low; i<=high; i++) {
            if(S[i] == pivotitem) {
                temp = S[i];
                S[i] = S[j];
                S[j] = temp;
                mark = j;
                j++;
            }
            else if(S[i] < pivotitem) {
                temp = S[i];
                S[i] = S[j];
                S[j] = temp;
                j++;
            }
        }
        pivotpoint = j-1;
        temp = S[mark];
        S[mark] = S[pivotpoint];
        S[pivotpoint] = temp;
    }
4

1 に答える 1

1

T を 0..r-1 として割り当てます。

int[] T = new int[r];

次に、1..r をステップ実行します。

for(i=1; i<=r; i++)
T[i] =
于 2012-03-03T15:16:15.310 に答える