[英]Getting wrong output for quicksort algorithm
我正在尝试实现quicksort,并且输出不正确。 我知道ArrayList
是按值引用的,但是我不明白为什么它没有给我正确的输出。 谁能告诉我我在做什么错?
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);
}
}
}
您的quicksort
方法返回已排序的数组,但您未分配它。 更改为
arraylist = quicksort(arraylist);
而且效果很好。
的确,您可以在quicksort方法中修改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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.