配列内の n 個の最小項目を判別するコードを作成しようとしています。私がこれに苦労しているのは悲しいことです。昔の私の大学の教科書のアルゴリズムに基づくと、これは正しいように見えます。ただし、スタックオーバーフロー例外が発生するため、明らかに何か間違っています。
私のアプローチは次のとおりです。
- ピボットを start + (end-start) / 2 に設定します (オーバーフローを防ぐために start+end/2 ではなく)
- この場所の整数を使用して、すべてを比較するピボットにします
- このピボットの周りのすべてを繰り返し交換して、物事がソートされるようにします(ピボットを基準にしてソートされます)
- n == ピボットの場合、完了したと思います
- それ以外の場合、たとえば 4 つの最小要素が必要でピボットが 3 の場合、右側 (または 2 番目に小さい要素が必要な場合は左側) を見る必要があります。
-
public static void main(String[] args) {
int[] elements = {30, 50, 20, 10};
quickSelect(elements, 3);
}
private static int quickSelect(int[] elements2, int k) {
return quickSelect(elements2, k, 0, elements2.length - 1);
}
private static int quickSelect(int[] elements, int k, int start, int end) {
int pivot = start + (end - start) / 2;
int midpoint = elements[pivot];
int i = start, j = end;
while (i < j) {
while (elements[i] < midpoint) {
i++;
}
while (elements[j] > midpoint) {
j--;
}
if (i <= j) {
int temp = elements[i];
elements[i] = elements[j];
elements[j] = temp;
i++;
j--;
}
}
// Guessing something's wrong here
if (k == pivot) {
System.out.println(elements[pivot]);
return pivot;
} else if (k < pivot) {
return quickSelect(elements, k, start, pivot - 1);
} else {
return quickSelect(elements, k, pivot + 1, end);
}
}
編集:有効な質問に反対票を投じる場合は、少なくとも理由をコメントしてください。