我现在已经在这个问题上苦苦挣扎了好几个小时。我正在尝试使用pseudocode example在Java中构建就地快速排序。是的,我已尝试逐字实现示例,但它有一个无限循环问题。但无论如何,逻辑看似合理,所以我一直在努力修复它几个小时。
我不能为我的生活找到工作的蠢事 - 这是一个使用简单列表的SSCCE:15, 12, 13
。事情按我预期的那样排序,但子列表没有正确分割。如果我删除交换区域中的指针,则不支持重复项。有人可以帮忙,或者指出一个有效的类似实现(我看起来没那么成功)?
SSCCE,没有痕迹:
import java.util.Arrays;
import java.util.List;
public class Quicksort {
public static void main(final String[] args0) {
List<Integer> unsorted = Arrays.asList(new Integer[]{15, 12, 13});
int size = unsorted.size();
int left = 0;
int right = size - 1;
int pivot = 13; // Median of first, middle, last. Method removed for brevity.
while (left < right) {
while (unsorted.get(left).compareTo(pivot) < 0) {
left++;
}
while (unsorted.get(right).compareTo(pivot) > 0) {
right--;
}
if (unsorted.get(left).compareTo(unsorted.get(right)) > 0) {
int old = unsorted.get(left);
unsorted.set(left, unsorted.get(right));
unsorted.set(right, old);
if (left + 1 < size) {
left++;
}
if (right - 1 >= 0) {
right--;
}
}
}
System.out.println("List: " + unsorted);
System.out.println("Sublist left: " + unsorted.subList(0, left)); // Yields [13, 15]
System.out.println("Sublist right: " + unsorted.subList(left, size)); // Yields [12]
// ...then recurse for sublists.
}
}
SSCCE,有痕迹(与上述相同):
import java.util.Arrays;
import java.util.List;
public class Quicksort {
public static void main(final String[] args0) {
List<Integer> unsorted = Arrays.asList(new Integer[]{15, 12, 13});
int size = unsorted.size();
int left = 0;
int right = size - 1;
int pivot = 13; // Median of first, middle, last. Method removed for brevity.
System.out.println("---Processing " + unsorted);
System.out.println("Median " + pivot);
System.out.println("Left = " + left + ", right = " + right);
while (left < right) {
System.out.println("Start INC/DEC, left = " + left + ", right = " + right);
while (unsorted.get(left).compareTo(pivot) < 0) {
left++;
}
while (unsorted.get(right).compareTo(pivot) > 0) {
right--;
}
System.out.println("End INC/DEC, left = " + left + ", right = " + right);
if (unsorted.get(left).compareTo(unsorted.get(right)) > 0) {
int old = unsorted.get(left);
unsorted.set(left, unsorted.get(right));
unsorted.set(right, old);
if (left + 1 < size) {
left++;
}
if (right - 1 >= 0) {
right--;
}
System.out.println("End swap, left = " + left + ", right = " + right + ", list now " + unsorted);
}
System.out.println("End while, left = " + left + ", right = " + right + ", list now " + unsorted);
}
System.out.println("List: " + unsorted);
System.out.println("Sublist left: " + unsorted.subList(0, left));
System.out.println("Sublist right: " + unsorted.subList(left, size));
// ...then recurse for sublists.
}
}
答案 0 :(得分:1)
您似乎在交换前比较值:
if (unsorted.get(left).compareTo(unsorted.get(right)) > 0)
而参考代码比较索引:
if left ≤ right
另请参阅比较差异:<=
而不是>
。