0080 分治法思想下的快速排序算法

public class QuickSorting {
    public static void quickSort(int[] nums, int start, int end){
        if (start > end)  //终止条件(细品)
            return;
        int i = start;
        int j = end;
        int pivot = nums[start]; //基准值选择第一个元素,此处不能用pivot = nums[0],因为是递归函数
        while (i < j){
            //(1)切记一定要从右边开始(否则最后pivot交换后达不到目的),如果右边一直大于pivot就一直将指针向左推进
            while (pivot <= nums[j] && i < j) //注意j可能此时已经等于i,需要加i<j判断
                j--;
            //如果左边一直小于pivot就一直将指针向右边推进
            while (pivot >= nums[i] && i < j) //同上
                i++;
            //(2)当两边指针无法推进,交换下就能进行下去了!
            if (i < j){
                int tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
            }
        }
        //此时的while的退出条件是i和j相等(此时左边小于pivot,右边大于pivot),需要交换nums[start](pivot)和nums[i](或nums[j])
        nums[start] = nums[i];
        nums[i] = pivot;
        //通过对pivot左右两边数组继续递归调用快排
        quickSort(nums, start, j - 1);
        quickSort(nums, j + 1, end);
    }
    //最好情况:数组已经有序,通过递归树可以分析得到:算法的二叉树高为logn,宽为n,因此T(n)=O(nlogn)
    //最坏情况:数组逆序,T(n)=O(n^2)
    //平均复杂度:O(nlogn), 空间复杂度O(1)


    public static void main(String[] args){
        int[] nums = {2,0,1,9,1,0,2,8};
        quickSort(nums, 0, nums.length - 1);
        for (int num: nums)
            System.out.print(num+" ");
    }
}

 

posted @ 2019-10-28 20:56  gendlee1991  阅读(18)  评论(0)    收藏  举报