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

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

2个月前 (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;
        }
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

一、题目解读力扣3115题要求在一个整数数组中,找出两个质数之间的最大差值。若数组不存在质数,则返回0。题目核心在于高效筛选质数,并计算其索引差值的最大值,需兼顾时间与空间复杂度。二、解题思路参考代码...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

一、题目解读牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘...

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

一、题目解读洛谷1656题要求在无向图中找出所有割边(即删除后导致图不连通的边)。题目核心在于判断图的连通性,并识别哪些边是“桥”。需理解图论中的连通分量概念,以及如何通过算法高效定位割边。二、解题思...

发表评论

访客

看不清,换一张

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