我的快速排序算法看起来应该都是有序的并且工作正常,但是当我尝试对随机整数列表进行排序时,我得到了一个NPE。究竟我做错了什么?
public ArrayList<Integer> quickSort(ArrayList<Integer> list, int l, int r){
ArrayList<Integer> sortedList = new ArrayList<Integer>();
while(l<r){
int partVal = partition(list, l, r, 0);
sortedList = quickSort(list, l, partVal-1);
sortedList = quickSort(list, partVal+1, r);
}
return sortedList;
}
public int partition(ArrayList<Integer> list, int l, int r, int pivot){
int pivotVal = list.get(pivot);
swapElements(list, pivot, r);
int counter = l;
for(int i = l; i < r; i++){
int pos = list.get(i);
if(pos <= pivotVal){
swapElements(list, i, counter);
counter++;
}
}
swapElements(list, r, counter);
return counter;
}
public void swapElements(ArrayList<Integer> list, int a, int b){
int temp = list.get(a);
list.replace(a, list.get(b));
list.replace(b, temp);
}
答案 0 :(得分:0)
您正在对数组进行排序,无需返回新列表
public ArrayList<Integer> quickSort(ArrayList<Integer> list, int l, int r){
if(r<l)return list;
int partVal = partition(list, l, r, l);
quickSort(list, l, partVal-1);
quickSort(list, partVal+1, r);
return list;
}
答案 1 :(得分:0)
让我们从这开始:
while (l < r) {
int partVal = partition(list, l, r, 0);
sortedList = quickSort(list, l, partVal-1);
sortedList = quickSort(list, partVal+1, r);
}
您期望循环如何终止? l
和r
的值不会更改,因此条件不会变为false。
目前还不清楚你为什么要循环...重点是递归调用完成了工作。我怀疑你想在这里if
。你在评论中说过,你最后得到的是NullPointerException
,你应该详细说明。仔细检查您的代码,计算您期望它做什么以及它实际做了什么。