[面试手撕1][快排]LC75.颜色分类

83 阅读2分钟

1.LC75:考察手撕快排

class Solution {
    public void sortColors(int[] nums) {
        quickSort(nums,0,nums.length-1);//这里是入口,传入数组的0索引和最后一个索引
    }
    //1.写一个交换方法
    private void swap(int[]nums,int i,int j){
        int tmp= nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
    //2.写一个基于基准元素的分区方法
    //最关键的一点:swap方法传入的是索引值,但是实际交换的是数组元素
    private int partition(int[]nums,int left,int right){
        //1.选取基准元素,这个是按你的喜好来,这里我们选择最右侧的元素为基准元素
        int pivot = nums[right];//选定好了基准元素
        int i = left-1;//这里是我们左指针
        //快慢指针思想:只有右指针指向的值比pivot小,则移动左指针,让左指针和右指针交换元素
        for(int j=left;j<right;j++){
            //这里的j是右指针
            //所以本题就是通过左右指针进行交换,从而实现pivot左侧的元素都比它小,pivot右侧的元素都比它大
            if(nums[j]<pivot){
                i++;
                swap(nums,i,j);
            }
        }
        swap(nums,i+1,right);
        //在确保遍历完整个数组,且较小元素放置到左边后,让right这个代表pivot的索引放到i的右侧,原因是:截止到i,都是j在遍历中发现的比Pivot小的元素,那很显然,pivot就应该放在i的右边,这个方法找的是分区索引,那我们返回这个索引作为分区的标准
        //将right放置到合适的位置
        return i+1;//return的i+1本质就是pivot的值
    }
    //3.写一个辅助方法,递归调用
    //4.sortColors的方法中调用辅助方法
    public void quickSort(int[] nums,int left,int right){
        if(left<right){
            int pIndex = partition(nums,left,right);
            quickSort(nums,left,pIndex-1);
            quickSort(nums,pIndex+1,right);
        }
    }
}