我有一个ArrayList
由字符串组成,全部为小写,没有唯一字符。我想按字母顺序排列这个ArrayList
,我尝试使用“quicksort”,但我注意到一个问题,即算法将第一个数据透视图放入第一个数据透视表后,我的lo
无法正确计算正确的位置。
例如,如果我的数组由a, d, e, c, a
组成,我的快速排序将枢轴a
置于正确位置并开始对数组的另一侧进行排序,则它从e
开始而不是d
a, d, a, c, e
导致结果为 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++;
while (lo<hi && ar.get(lo).compareTo(pivot) < 0){
lo++;
}
hi--;
while (hi>lo && ar.get(hi).compareTo(pivot) > 0){
hi--;
}
if (lo<hi){
swap(ar, lo, hi);
}else {
return hi;
}
}
}
。
代码:
public Document(String fName){
ArrayList xa = loadFile(fName);
sort(xa, 0, xa.size() - 1);
}
方法算法被称为:
lo
我尝试过这么多次调试,但是我一直迷失在编译器开始上堆栈树的部分。为什么我的 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;
}
一个值高于所需值?是什么造成的?
交换方法:
0
注意:我从位置{{1}}的
开始答案 0 :(得分:2)
您必须在分区方法中考虑相同的情况。 您只需更改第二个,如下所示:
while (hi>lo && ar.get(hi).compareTo(pivot) >= 0){