我想寫代碼來確定數組中的最小項。我很難過,爲此而苦苦掙扎。根據我大學教科書的算法,從今天起,這看起來是正確的。然而,顯然我做錯了,因爲它給我一個堆棧溢出異常。Quickselect實施不起作用
我的做法是:
- 設置樞軸是在開始+(端開始)/ 2(而不是啓動+結束/ 2,以防止溢出)
- 使用整數在此位置是我比較一切
- 迭代和交換解決這個支點一切,所以事情進行排序(排序相對於樞軸)樞
- 如果n ==支點,那麼我想我做
- 否則,如果我想要4個更小t元素和樞軸爲3,例如,那麼我需要看右側(或左側,如果我想第二小元素)。
-
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);
}
}
編輯:請至少懶得評論爲什麼如果你要downvote一個有效的問題。
請至少懶得評論爲什麼如果你要downvote一個有效的問題。 – Beebunny