使用arraylist java进行快速排序

使用arraylist java进行快速排序,java,arraylist,quicksort,Java,Arraylist,Quicksort,我已经为arraylist编写了一个快速排序,目前的逻辑似乎是合理的。我遇到的问题是元素的交换。似乎发生的不是交换元素,而是用要交换的元素替换现有元素。一个示例运行以一个类似于[happy,Apple,eat,food]的列表开始,排序运行后,它会出现[happy,happy,happy,food]。我确信我的错误很简单,但我已经盯着它太久了,需要重新审视。这是到目前为止我的代码。提前谢谢 String pivot = list.get(0); // Choose the first eleme

我已经为arraylist编写了一个快速排序,目前的逻辑似乎是合理的。我遇到的问题是元素的交换。似乎发生的不是交换元素,而是用要交换的元素替换现有元素。一个示例运行以一个类似于[happy,Apple,eat,food]的列表开始,排序运行后,它会出现[happy,happy,happy,food]。我确信我的错误很简单,但我已经盯着它太久了,需要重新审视。这是到目前为止我的代码。提前谢谢

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;
    }
  }
stringpivot=list.get(0);//选择第一个元素作为轴
int低=第一个+1;//向前搜索索引
int高=最后一个;//反向搜索索引
while(高>低)
{//从左向前搜索

while(low first&&list.get(high.compare)to(pivot)是的,我认为错误很简单。试试这个

String tempHigh = list.get(high);
String tempLow = list.get(low);
list.set(high, tempLow);
list.set(low, tempHigh);
因为在java中,赋值是通过引用完成的。在代码中,您只是简单地将高值设置为高和低位置。当您将pivot与list[high]

交换pivot时,问题(在修复pivot选择以使用
list.get(first)
后)是

可以缩写为
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;
}

如果在第一个分区循环之后,索引
high
处的元素大于枢轴,则之前的元素小于或等于枢轴。否则,
high
是不大于枢轴的元素的最大索引。

String pivot=list.get(0);//选择第一个元素作为轴心
谢谢,在我发布代码后,我确实捕捉到了这一点,但是它无法解决我遇到的问题。我尝试了这种方法,但不幸的是,它没有解决我的问题。我的问题可能比我最初想象的要大。
String pivot = list.get(0);
if (list.get(high).compareTo(pivot) < 0) 
{ 
    list.set(first, list.get(high));
    list.set(high,pivot);
    return high;
}
if (list.get(high).compareTo(pivot) > 0) {
    --high;
}