当我测试我的快速排序时,我注意到了另一个问题。有时它按字母顺序排列数组,有时则不按字母顺序排列。例如,如果我将p, o, j, l
作为我的数组,则会将其排序为j, o, l, p
这是错误的,因为l
应该在o
之前,但是如果我将a
添加到a, j, l, o, p
数组排序到private ArrayList<String> sort(ArrayList<String> ar, int lo, int hi){
if (lo < hi){
int splitPoint = partition(ar, lo, hi);
sort(ar, lo, splitPoint);
sort(ar, splitPoint +1, hi);
}
return ar;
}
private int partition(ArrayList<String> ar, int lo, int hi){
String pivot = ar.get(lo);
lo--;
hi++;
while (true){
lo++;
hi--;
while (lo<hi && ar.get(lo).compareTo(pivot) < 0){
lo++;
}
while (hi>lo && ar.get(hi).compareTo(pivot) >= 0){
hi--;
}
if (lo<hi){
swap(ar, lo, hi);
}else {
return hi;
}
}
}
private ArrayList<String> swap(ArrayList<String> ar, int a, int b){
String temp = ar.get(a);
ar.set(a, ar.get(b));
ar.set(b, temp);
return ar;
}
这是正确的。为什么会这样?
代码:
{{1}}
答案 0 :(得分:0)
据我所见,你没有改变枢轴元素的位置。你只是和lo交换。
最后,您应将枢轴放在正确的位置,然后将其返回。
答案 1 :(得分:0)
我认为循环的最后一次迭代存在危险。
假设你有一个数组2,1。
你的支点是2。
lo索引会增加,直到找到一个高于枢轴1或满足hi的元素。 在这种情况下,它将满足hi,并且lo和hi将指向1。
此时,分区函数返回并报告数组已分区为:
{2},{1}
但这是不正确的,因为1是&lt;比枢轴更应该在第一个分区中。
也许当你遇到嗨时你应该进行额外的测试,看看hi中的元素是否应该包含在左边或右边的分区中?