LeetCode--75.颜色分类(三路快排,计数排序)

1. 题目描述

难度:中等
在这里插入图片描述

2. 题目解析

这道题需要注意一下几点:

  • 原地进行排序,不可以另外申请数组空间。
  • 数组元素最多只有三个元素0, 1, 2,但是要考虑空数组和单个元素的例子

有两种方法:

  • 计数排序法
    遍历出0,1,2元素的个数,然后按照这个个数重新写入数组,时间复杂度为O(n).
  • 三路快排法
    三路快排思想,就是大于1的放右边,小于1的放左边,等于1的不动,这样只遍历一遍就可以了,时间复杂度为O(n)

3. C语言实现

3.1 三路快排法

代码如下:

// 交换两个对象
void swap(int* nums, int a, int b){
    int temp;
    temp = nums[a];
    nums[a] = nums[b];
    nums[b] = temp;
}
void sortColors(int* nums, int numsSize){
    int i, left, right;
    i = 0;
    left = -1;
    right = numsSize;
    while(i < right){
    	// 如果元素=0,将该元素放在数组前面
        if(nums[i] == 0){
            left++;
            swap(nums, i, left);
            i++;
        }
        // 如果元素=2,将元素放在数组后面
        else if(nums[i] == 2){
            right--;
            swap(nums, right, i);
        }
        else
            i++;
    }
}

运行结果为:
在这里插入图片描述

3.2 计数排序法

代码如下:

void sortColors(int* nums, int numsSize){
    int i, r=0, w=0, b=0;
    for(i = 0; i < numsSize; i++){
        if(nums[i] == 0) r++;
        else if(nums[i] == 1) w++;
        else b++;
    }
    for(i = 0; i < numsSize; i++){
        if(i < r) nums[i] = 0;
        else if(i >= r && i < r+w) nums[i] = 1;
        else nums[i] = 2;
    }
}

运行结果为:
在这里插入图片描述

发布了163 篇原创文章 · 获赞 188 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42580947/article/details/104725305