快速排序之犯蠢迷惑

148 阅读1分钟

快速排序的迷惑: 代码如下

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;
}