我为一个arraylist写了一个quicksort,因为它的逻辑似乎是合理的。我遇到的问题是交换元素。似乎正在发生的事情不是交换元素,而是将现有元素替换为要交换的元素。一个例子运行从一个像[快乐,苹果,吃,食物]的列表开始,并在排序运行后,它出来[快乐,快乐,快乐,食物]。我确定我的错误很简单,但我已经盯着它看了太久,需要新鲜的眼睛。到目前为止,这是我的代码。提前谢谢!
String pivot = list.get(0); // Choose the first element as the pivot
int low = first + 1; // Index for forward search
int high = last; // Index for backward search
while (high > low)
{ // Search forward from left
while (low <= high && list.get(low).compareTo(pivot) <= 0)
{
low++;
}
// Search backward from right
while (low <= high && list.get(high).compareTo(pivot) > 0)
{
high--;
}
// Swap two elements in the list
if (high > low)
{
String temp = list.get(high);
list.set(high,list.get(low));
list.set(low,temp);
}
}
while (high > first && list.get(high).compareTo(pivot) <= 0)
{
high--;
}
// Swap pivot with list[high]
if (list.get(high).compareTo(pivot) < 0)
{
list.set(first, list.get(high));
list.set(high,pivot);
return high;
}
else
{
return first;
}
}
答案 0 :(得分:0)
是的,我认为错误很简单。试试这个
String tempHigh = list.get(high);
String tempLow = list.get(low);
list.set(high, tempLow);
list.set(low, tempHigh);
因为在java中通过引用完成了赋值。在您的代码中,您只需将高值设置为高和低。低位。使用list [high]
交换pivot时也是如此答案 1 :(得分:0)
问题(在修改枢轴选择以使用list.get(first)
之后)是
while (high > first && list.get(high).compareTo(pivot) <= 0)
此时,索引high
之前(包括)的所有元素(按字典顺序)小于或等于数据透视表。因此
while(高&gt;第一&amp;&amp; list.get(高).compareTo(pivot)&lt; = 0) {
high--;
}
可以缩写为high = first
。
这解释了第一个元素与
的重复String pivot = list.get(0);
枢轴选择,因为在您的示例中,索引0处的元素是最大的,因此
if (list.get(high).compareTo(pivot) < 0)
{
list.set(first, list.get(high));
list.set(high,pivot);
return high;
}
分支,list.set(first, list.get(high));
不执行任何操作,因为high == first
,然后list.set(high,pivot);
将数据透视复制到索引high (== first)
。
您在有问题的行中需要的是
if (list.get(high).compareTo(pivot) > 0) {
--high;
}
如果在第一个分区循环之后,索引high
处的元素大于枢轴,则之前的元素小于或等于枢轴。否则,high
是不大于数据透视的元素的最大索引。