我在查找此排序算法中的错误时遇到问题。当我将一个数组传递给sort方法时,比如5,6,4,7,1,我得到了相同的数组。我一直在浏览代码,但我找不到它出错的地方。无视SortThread任务,它是一个会更新进度条的参数,但我现在没有使用它。
class QuickSort extends Sort {
@Override
ArrayList<Integer> sort(ArrayList<Integer> array, SortThread task) {
if (array.size() <= 1) {
return array;
}
int middle = (int) Math.ceil((double) array.size() / 2);
int pivot = array.get(middle);
ArrayList<Integer> less = new ArrayList<>();
ArrayList<Integer> greater = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
if (array.get(i) <= pivot) {
if (i == middle) {
continue;
}
less.add(array.get(i));
} else {
greater.add(array.get(i));
}
}
return concatenate(sort(less, task), pivot, sort(greater, task));
}
private ArrayList<Integer> concatenate(ArrayList<Integer> less, int pivot, ArrayList<Integer> greater) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < less.size(); i++) {
list.add(less.get(i));
}
list.add(pivot);
for (int i = 0; i < greater.size(); i++) {
list.add(greater.get(i));
}
return list;
}
}
答案 0 :(得分:1)
其他人说你可能正在打印原件,因为你的代码工作正常。
您可以尝试使用此功能,它会对其进行原位排序,从而减少意外行为并提高效率。我所做的就是concatenate
取一个新参数,它应该把它的结果放在哪里。
顺便说一句:我建议你在比较之前拔出if (i == middle) { continue; }
,这也会稍微提高效率。
static class QuickSort {
public static ArrayList<Integer> sort(ArrayList<Integer> array) {
if (array.size() <= 1) {
return array;
}
int middle = (int) Math.ceil((double) array.size() / 2);
int pivot = array.get(middle);
ArrayList<Integer> less = new ArrayList<>();
ArrayList<Integer> greater = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
if (array.get(i) <= pivot) {
if (i == middle) {
continue;
}
less.add(array.get(i));
} else {
greater.add(array.get(i));
}
}
return concatenate(sort(less), pivot, sort(greater), array);
}
private static ArrayList<Integer> concatenate(ArrayList<Integer> less, int pivot, ArrayList<Integer> greater, ArrayList<Integer> list) {
list.clear();
for (int i = 0; i < less.size(); i++) {
list.add(less.get(i));
}
list.add(pivot);
for (int i = 0; i < greater.size(); i++) {
list.add(greater.get(i));
}
return list;
}
}
你可以进一步改进连接:
list.clear();
list.addAll(less);
list.add(pivot);
list.addAll(greater);
答案 1 :(得分:0)
您没有进行任何实际排序。您只是将所有内容放入较小的列表中,然后将它们放回更大的列表中。你需要进行一些比较。
看看你的连接方法。你只是将较少的列表放回到较少的列表中。您需要将值与枢轴进行比较,以确定该值应该去的位置。
编辑:我最初的想法是错误的。我测试了你的代码并且它有效。我猜你正在打印出你传入的阵列?请注意,传递给sort函数的实际数组未排序。只返回了一个。
答案 2 :(得分:-1)
array.get(i)返回一个Integer,你需要提取包装的int,否则你要比较指针。