Quicksort在某些情况下不起作用

时间:2014-02-08 16:39:16

标签: java algorithm quicksort

当我测试我的快速排序时,我注意到了另一个问题。有时它按字母顺序排列数组,有时则不按字母顺序排列。例如,如果我将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}}

2 个答案:

答案 0 :(得分:0)

据我所见,你没有改变枢轴元素的位置。你只是和lo交换。

最后,您应将枢轴放在正确的位置,然后将其返回。

答案 1 :(得分:0)

我认为循环的最后一次迭代存在危险。

假设你有一个数组2,1。

你的支点是2。

lo索引会增加,直到找到一个高于枢轴1或满足hi的元素。 在这种情况下,它将满足hi,并且lo和hi将指向1。

此时,分区函数返回并报告数组已分区为:

{2},{1}

但这是不正确的,因为1是&lt;比枢轴更应该在第一个分区中。

也许当你遇到嗨时你应该进行额外的测试,看看hi中的元素是否应该包含在左边或右边的分区中?