Java快速排序的理解

public static void main(String[] args) {
        int[] arr = {100, 7, 245, 5, 900,234,12,16,3,41,345,1345,234,62,356,3,45,23,45,234,52,34,52,3465,2,345,2,345,2,34,5,234,5,23,45,23,45,23,45,2,573,45,345234,5};
        //快速排序法
        kuaisu(arr,0,arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
        }
    }
    public static void kuaisu(int[] arr, int i, int j) {
         //递归出口,切记<=是关键,两个都要!!!缺一不可。
        low-1的存在甚至可以导致j的值为-1
        if(j<=i)return;
        int low = i, hight = j, basenumber = arr[i],swap;
        while(true){
            /*切记!!!基准数在最左边,则先动hight,基准数归的位也是hight所在位置。因为在进行基准数归位时,
            要把一个比基准数小的数换到左边来(也就是基准数所在的最左边),
            正好hight所对应的数遇到比基准数小的才会停止,让hight先动,low和hight相遇的位值一定是一个比基准数小的数
            如果让low先动,那么low与hight相遇的位置一定是比基准数大的位置。*/
            while (true) {
                if (arr[hight] >= basenumber) hight--;
                //由于arr[hight]等于basenumber也会向左移,所以low>=hight一定要加大于号
                if (arr[hight]< basenumber||low>=hight) break;
            }
            while (true) {
                if (arr[low] <= basenumber)low++;
                if (arr[low] > basenumber||low>=hight) break;
            }
            swap = arr[hight];
            arr[hight] = arr[low];
            arr[low] = swap;
            //高低索引已经相遇,一轮排序已经结束,进行基准数归为,直接结束外循环
            if(low>=hight){
                swap = arr[hight];
                arr[hight] = arr[i];
                arr[i] = swap;
                break;
            }
        }
        //左边
        kuaisu(arr,i,low-1);//low-1原因是基准数不再进行排位
        //右边
        kuaisu(arr,hight+1,j);//hight+1原因是基准数不再进行排位
    }

最详细,可以反驳

猜你喜欢

转载自blog.csdn.net/2301_80160619/article/details/136148749