leetcode 912.排序数组 (medium)(优质解法)

leetcode 912.排序数组 (medium)(优质解法)_第1张图片

代码:

class Solution {
    //通过快排来解决该问题
    //数组划分 3 块,随机选择基准元素
    public int[] sortArray(int[] nums) {
        qSort(nums,0,nums.length-1);
        return nums;
    }

    public void qSort(int[] nums,int L,int R){
        //递归出口
        if(L>=R){
            return;
        }
        //随机选择一个基准元素
        int key=nums[new Random().nextInt(R-L+1)+L];
        //根据基准元素对数组进行划分,划分为 > key , = key,< key 3部分
        int i=L;    //用于遍历数组进行划分
        int left=L-1;    //用于指向 key 区间的第一个数据

        while(ikey 区间进行相同的操作即可
        qSort(nums,L,left);
        qSort(nums,right,R);
    }

    public void swap(int[]nums,int i,int j){
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }
}

题解:

        本题是一个简单排序数组的题,该篇博客中我们采用快速排序的方法来进行排序

        快速排序的核心就是随机选择一个基准数据,按照基准数据将数组划分为 3 个部分,分别是 < key,= key ,> key 的三个部分,关于如何根据基准元素将数组划分为 3 个部分推荐先看博客leetcode 75. 颜色分类(medium)(优质解法)

        根据上面的博客就能知道划分的方法,这里就不多说了,将数组划分以后,数组被划分为了 3 个部分,如下所示:

leetcode 912.排序数组 (medium)(优质解法)_第2张图片

        = key 区间中的数据所处的是正确的位置,所以不用再管,现在只需要在 [ L, left ] ( key ) 区间执行和上述相同的操作(递归)即可

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)