[英]Java kthSmallestElement using Quicksort Infinite Loop Error
因此,我使用改良的quicksort算法實現了“在數組中找到第k個最小元素”。 但是,現在這是無限循環。 我不太確定錯誤在哪里。 更新:調試器說錯誤在第14行:“返回kthSmallestError(arr,start,j-1,k);根據print語句,(start,j-1,k)值是(3,3,0 )“,謝謝您的幫助!
class kthSmallestElement {
public static void main(String[] args) {
int[] input = {3, 1, 5, 2, 6, 4, 7};
int result = kthSmallestElement(input, 0, input.length-1, 3);
System.out.println(result);
}
public static int kthSmallestElement(int[] arr, int start, int end, int k) {
int j = partition(arr, start, end);
if (j == k) return arr[j];
if (j < k) {
return kthSmallestElement(arr, j+1, end, k-j-1);
}
else {
return kthSmallestElement(arr, start, j-1, k);
}
}
public static int partition(int[] arr, int left, int right) {
int pivot = arr[left+(right-left)/2];
while (left <= right) {
while (arr[left] < pivot) {
left++;
}
while (arr[right] > pivot) {
right--;
}
if (left <= right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
return left;
}
}
一個明顯的錯誤: left, right, j
是絕對索引,而k
是相對的。 j
和k
之間的所有比較和算術均應通過start
進行校准。
請嘗試這個。
謝謝,
- 約翰
public static int kthSmallestElement(int[] arr, int start, int end, int k) {
//int j = partition(arr, start, end);
int j = partition2(arr, start, end);
if (j == k)
return arr[j];
if (j < k) {
// without -1 as original code.
return kthSmallestElement(arr, j + 1, end, k - j );
} else {
return kthSmallestElement(arr, start, j - 1, k);
}
}
public static int partition2(int[] arr, int lo, int hi) {
int left = lo;
int right = hi+1;
int p = arr[lo];
while (true) {
while (arr[++left] < p) {
if (left == hi)
break;
}
while (p < arr[--right]) {
if (right == lo) {
break;
}
}
if (left >= right) {
break;
}
exchange(arr, left, right);
}
exchange(arr, lo, right);
return right;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.