Java 获取快速排序算法的错误输出

Java 获取快速排序算法的错误输出,java,algorithm,sorting,quicksort,Java,Algorithm,Sorting,Quicksort,我正在尝试实现快速排序,但输出不正确。我知道ArrayLists是由值引用的,但我不明白为什么它没有给我正确的输出。谁能告诉我我做错了什么 import java.util.ArrayList; public class Quicksort { static ArrayList<Integer> quicksort(ArrayList<Integer> place){ if(place.size()<=1) return place;

我正在尝试实现快速排序,但输出不正确。我知道
ArrayList
s是由值引用的,但我不明白为什么它没有给我正确的输出。谁能告诉我我做错了什么

import java.util.ArrayList;

public class Quicksort {

static ArrayList<Integer> quicksort(ArrayList<Integer> place){
    if(place.size()<=1)
        return place;
    int median=place.size()/2;

    int pivot=place.get(median);
    place.remove(median);

    ArrayList<Integer> place2=new ArrayList<>();
    ArrayList<Integer> place3=new ArrayList<>();

    for(int i=0;i<place.size();i++){
        if(place.get(i)<pivot){
            place2.add(place.get(i));
        }else if(place.get(i)>pivot){
            place3.add(place.get(i));
        }else if(place.get(i)==pivot){
            place3.add(place.get(i));
        }
    }
    return concatenate(quicksort(place2),pivot,quicksort(place3));
}

static ArrayList<Integer> concatenate( ArrayList<Integer> first, int pivot, ArrayList<Integer> second){
    ArrayList<Integer> third=new ArrayList<>();

    for(int i=0;i<first.size();i++){
        third.add(first.get(i));
    }

    third.add(pivot);
    for(int i=0;i<second.size();i++){
        third.add(second.get(i));
    }

    return third;
}

public static void main(String[] args) {

ArrayList<Integer> arraylist=new ArrayList<>();

arraylist.add(20);
arraylist.add(3);
arraylist.add(8);
arraylist.add(4);
arraylist.add(7);
arraylist.add(1);
arraylist.add(9);
arraylist.add(13);

    quicksort(arraylist);
    for(int n:arraylist){
        System.out.println(n);
    }
}
}
import java.util.ArrayList;
公共类快速排序{
静态ArrayList快速排序(ArrayList位置){

如果(place.size()您的
快速排序
方法返回排序后的数组,但您没有分配它。请将其更改为

arraylist = quicksort(arraylist);
而且效果很好


确实,您可以在快速排序方法中修改arraylist,因此无需分配它,但这不是您要做的。您要做的就是删除透视,然后返回一个由
concatenate
创建的新列表。这就是为什么在您的算法中,您会得到缺少
7
的原始列表

如果不想再次分配列表,则需要执行以下操作:

private static void quicksort(List<Integer> place) {
    if (place.size() <= 1)
        return;

    int median=place.size()/2;
    int pivot=place.get(median);
    place.remove(median);

    List<Integer> place2 = new ArrayList<>();
    List<Integer> place3 = new ArrayList<>();

    Iterator<Integer> it = place.iterator();
    while (it.hasNext()) {
        int i = it.next();
        if (i < pivot) {
            place2.add(i);
        } else {
            place3.add(i);
        }
        it.remove();
    }

    quicksort(place2);
    quicksort(place3);

    for (Integer i : place2) {
        place.add(i);
    }
    place.add(pivot);
    for (Integer i : place3) {
        place.add(i);
    }
}
私有静态无效快速排序(列表位置){

if(place.size()第一个弹出的东西:
int-median=place.size()/2;
应该是
int-median=place.get(place.size()/2)
。啊,对不起,还是同样的要点。这不是一个bug…这就是它的实现方式任何其他建议?可能都搞糟了。我为什么要分配它?@user35265你分配什么?它对我来说非常好。谢谢你的精彩解释!