算法通关村第10关——快速排序并不难(青铜)

题目:

leetcode912 排序数组

给你一个整数数组 nums,请你将该数组升序排列。

题解:

我们使用快速排序实现,思路:

在数组中任选一个中间值pivot,然后遍历数组使 小于pivot的在左边,大于pivot的在右边,然后递归再对左边和右边进行上述排序,直到只有一个元素时,递归结束。

实现:
1、使用快慢双指针实现
    /**
     * 使用快慢的双指针实现
     * @param arr
     * @param low
     * @param high
     */
    public static void quickSort(int[] arr,int low,int high){
        //排序的临界条件 只有一个元素时就可以不排序
        if (low >= high){
            return;
        }
        int index = new Random().nextInt(high-low+1)+low;
        int tmp = arr[index];
        arr[index] = arr[low];
        arr[low] = tmp;
        int pivot = arr[low];   //任选一个 中间值pivot(第一个元素)
        int i = low;    //i表示 在i下标之前(包括i)的值都是小于等于 中间值pivot
        for (int j = low+1; j <= high; j++) {   //从第二个开始遍历
            if (arr[j] < pivot){   //遍历到的元素如果小于 中间值pivot 就使 i++ 且下标i和下标j的元素交换
                i++;
                int t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
            }
        }
        //将选中的 第一个元素中间值pivot 于下标i的元素交换
        int t = arr[i];
        arr[i] = arr[low];
        arr[low] = t;
        //继续递归(low,i-1)和(i+1,high)
        quickSort(arr,low,i-1);
        quickSort(arr,i+1,high);
    }
2、使用对撞双指针实现
    public int[] sortArray(int[] nums) {
        quickSort(nums,0,nums.length-1);
        return nums;
    }
    
    //使用对撞双指针实现快速排序
    public static void quickSort(int[] arr,int low,int high){
        //排序的临界条件 只有一个元素时就可以不排序
        if (low >= high){
            return;
        }
        int index = new Random().nextInt(high-low+1)+low;
        int pivot = arr[index];
        //i表示 在i下标之前全是小于pivot
        //j表示 在j下标之后全是大于pivot
        int i = low,j = high;
        while (i <= j){
            while (i <= j && arr[i] < pivot){//小于pivot,i++
                i++;
            }
            while (i <= j && arr[j] > pivot){//大于pivot,j--
                j--;
            }
            //此时,i的元素值大于等于pivot,j的元素值小于等于pivot
            //所以下标为i和j的元素进行交换
            if (i <= j){
                int t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
                i++;
                j--;
            }
        }
        //继续递归pivot的左边和右边元素
        quickSort(arr,low,j);
        quickSort(arr,i,high);
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值