常用的排序算法------练习4

1. 题目

2. 思路和题解

这道题是很经典的荷兰国旗问题,根据题目意思,要对这个数组按照颜色排序,而此时现在的红、白、蓝三个颜色分别对应0,1,2,因此可以想到使用冒泡排序对该数组进行排序。

代码如下:

java 复制代码
class Solution {
    public void sortColors(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = nums.length - 1; j > i; j--) {
                if (nums[j - 1] > nums[j]) {
                    int temp = nums[j];
                    nums[j] = nums[j - 1];
                    nums[j - 1] = temp;
                }
            }
        }
    }
}

虽然这种方法可以通过,但是时间复杂度很高,然后查看了官方给出的题解,官方是先统计数组中0,1,2的个数,然后根据他们的数量,重写整个数组。初始化两个指针分别指向0和nums.length - 1,然后如果遇到0,就交换到数组的头部,遇到2,就交换到数组的尾部,当遍历的数组超过了右指针,则遍历结束。这一需要注意的一点是,当找到2时,需要不断地将其进行交换,直到新的numsi不为2,才能停止交换。

代码如下:

java 复制代码
class Solution {
    public void sortColors(int[] nums) {
        int left = 0, right = nums.length - 1;
        for (int i = 0; i <= right; ++i) {
            while (i <= right && nums[i] == 2) {
                int temp = nums[i];
                nums[i] = nums[right];
                nums[right] = temp;
                --right;
            }
            if (nums[i] == 0) {
                int temp = nums[i];
                nums[i] = nums[left];
                nums[left] = temp;
                ++left;
            }
        }
    }
}

用这种方法,时间复杂度就低很多了,也能更适用于普遍的情况。

相关推荐
SamDeepThinking7 分钟前
高并发场景下,CompletableFuture与ForkJoinPool该如何取舍?
java·后端·面试
用户938515635071 小时前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC2 小时前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥3 小时前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
张不才3 小时前
CPU 100% 了怎么办?Java 性能排障的标准化操作
java·后端
地平线开发者4 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者4 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
shepherd1114 小时前
吞吐量提升 10 倍:高并发大批量数据处理任务的架构演进与性能调优
java·后端·架构
半个落月7 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
plainGeekDev7 小时前
单例模式 → object 声明
android·java·kotlin