当前位置:首页 > 力扣 > 力扣第75题新思路:如何用选择排序实现原地操作?

力扣第75题新思路:如何用选择排序实现原地操作?

5个月前 (05-12)

给定一个包含红色、白色和蓝色元素的数组,分别用数字 0、1、2 表示,要求在不使用库排序函数的情况下,仅通过一次遍历(但实际上允许使用经典排序方法)对数组进行原地排序。题目要求将所有 0 排在前面,1 排在中间,2 排在最后,且需要保持元素间的相对顺序。本题的核心是实现一个高效的原地排序算法,但所提供的代码通过经典的选择排序思想完成目标。


力扣第75题新思路:如何用选择排序实现原地操作? 力扣 选择排序 数组 C++ 算法 第1张

选择排序的核心思路是:每次从未排序区间中找到最小值,将其与未排序区间的第一个元素交换,逐步扩展有序区间的范围。具体过程如下:

1‌.外层循环控制有序区间‌:从第一个元素开始,依次向后遍历,每次确定一个位置的最终值。

‌2.内层循环寻找最小值‌:对于当前未排序的位置 i,通过内层循环遍历其后的所有元素,寻找最小值的索引 minIndex。

3‌.元素交换‌:将找到的最小值与当前外层循环的位置 i 的元素交换,确保每次外层循环结束后,区间 [0, i] 是有序的。

4‌.逐步扩展有序范围‌:重复上述过程,直到整个数组有序。

5.时间复杂度为 O(n²),空间复杂度为 O(1)。


代码:

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int n = nums.size();      // 获取数组长度
        int minIndex = 0;         // 记录最小值的位置
        
        // 外层循环:逐步确定每个位置的元素
        for (int i = 0; i < n; i++) {
            minIndex = i;         // 初始最小值位置为当前未排序区间的首位
            
            // 内层循环:在未排序区间中寻找最小值的位置
            for (int j = i + 1; j < n; j++) {
                if (nums[j] < nums[minIndex]) {
                    minIndex = j; // 更新最小值的位置
                }
            }
            
            // 将最小值与当前位置交换,确保当前位置的值是最终结果
            int tmp = nums[i];
            nums[i] = nums[minIndex];
            nums[minIndex] = tmp;
        }
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

题目重解给定一个字符串,将字符按照出现频率降序排列。例如输入"tree",可能返回"eetr"或"eert"。题目要求我们不考虑字母顺序,只...

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

题意解析:给定一组数字,每当你选择一个数字x时,所有等于x-1和x+1的数字都会被自动移除。你需要通过巧妙的选择顺序,最大化获得的点数总和。这个问题可以转化为对离散化数字分布的动态规划问题——将相邻数...

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

题目重解给定一个仅包含'L'和'R'的字符串,要求将其分割成尽可能多的子串,且每个子串中'L'和'R'的数量相等。例如输入"R...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

力扣94:递归之美 轻松掌握二叉树中序遍历

力扣94:递归之美 轻松掌握二叉树中序遍历

题目解读二叉树的中序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。对于二叉搜索树,中序遍历的结果恰好是节点值的升序排列。给定一个二叉...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。