24.颜色分类(题号:75)

import java.util.Arrays;

public class SortColors {
    //方法一:直接调库
    public void sortColors1(int[] nums) {
        Arrays.sort(nums);
    }

    //方法二:基于选择排序的一种实现
    public void sortColors2(int[] nums) {
        //定义一个指针,指向当前应该填入元素的位置
        int cur = 0;

        //1.遍历数组,将所有的0交换到起始位置
        for (int i = 0; i <nums.length ; i++) {
            if(nums[i]==0){
                swap(nums,cur++,i);
            }
        }

        //2.遍历数组,将所有的1交换到中间位置
        for (int i = 0; i <nums.length ; i++) {
            if(nums[i]==1){
                swap(nums,cur++,i);
            }
        }
    }
    private static void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }

    //方法三:基于计数排序的一种实现
    public void sortColors3(int[] nums) {
        int count0 = 0,count1 = 0;

        //遍历数组,统计0,1,2个数
        for (int num : nums) {
            if(num==0){
                count0++;
            }else if(num==1){
                count1++;
            }
        }

        //将0,1,2按照个数依次放入nums数组
        for (int i = 0; i <nums.length ; i++) {
            if(i<count0){
                nums[i] = 0;
            }else if(i<count1+count0){
                nums[i] = 1;
            }else{
                nums[i] = 2;
            }
        }
    }

    //方法四:基于快排排序的一种实现
    public void sortColors(int[] nums) {
        //定义左右指针
        int left = 0,right =  nums.length-1;

        //定义一个遍历所有元素的指针
        int i = left;

        //循环判断,遍历元素
        while (left<right&&i<=right){
            //1.如果是2,换到末尾,右指针左移
            while (i<=right&&nums[i]==2){
                swap(nums,i,right--);
            }

            //2.如果是0,换到头部,左指针右移
            if(nums[i]==0){
                swap(nums,i,left++);
            }

            //3.i++  继续遍历
            i++;
        }
    }
    public static void main(String[] args) {
        int[] nums = {2,0,2,1,1,0};
        SortColors sortColors = new SortColors();
        sortColors.sortColors(nums);
        for (int num : nums) {
            System.out.print(num+"\t");
        }
    }
}
全部评论

相关推荐

2025-12-19 19:02
西安交通大学 Java
程序员牛肉:双九,而且还是西交这种比较好的985九没必要再投日常了。你投中小厂,人家会觉得你学历这么顶还面试肯定是海投的,过了你也不去。所以不约你了。 直接准备暑期实习就好,现在你可以面试。但是目的不再是去日常实习了,而是熟悉面试节奏。 后续把精力放到八股,算法和AI知识上。抽空把自己这两个项目换了,怎么选项目可以看看我主页写的文章。 你学历不错的,不要焦虑
那些拿到大厂offer的...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务