このアルゴリズムを本から直接コピーしていますが、「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;
}