快速排序的迷惑: 代码如下
public static void quickSort(int[] arr,int start,int end){
//需要一个start,留给分治的时候的未改变的值
int i=start,j=end;
if(i >= j){
return;
}
int index = i,temp;
while(j > i) {
//分治这里有个递归,所以需要确定边界也就是最外层的while(j > i)
// 确定的index时候,从两头分别向最终index逼近的时候也有两个边界
while(j > i && arr[j] >= arr[index]) {
j--;
}
if(j > i){
swap(arr[j],arr[index]);
// temp=arr[j];
// arr[j]=arr[index];
// arr[index]=temp;
index = j;
}
while(j > i && arr[i] <= arr[index]){
i++;
}
if(j > i) {
/**
* ?????????????????这里就很奇葩,用swap就死循环了,但是swap代码没问题,用这个代码就对了
*/
//swap(arr[i],arr[index]);
temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
index = i;
}
quickSort(arr,start,index-1);
quickSort(arr,index+1,end);
}
}
//交换值
public static void swap(int n,int m){
int temps=n;
n=m;
m=temps;
}
问题找到了,果然是一个新手错误,这个交换数组两值的swap方法有误:其实是另建了int类型的对象,操作是在新的int数组上进行的,对原数组并没有产生任何更改,如果需要,需要传入数组的引用:
public static void swap(int n,int m,int[] arr){
int temps=arr[n];
arr[n]=arr[m];
arr[m]=temps;
}