按奇偶排序数组 II

给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。

对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。

你可以返回任何满足上述条件的数组作为答案。

 

示例:

输入:[4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
 

提示:

2 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-array-by-parity-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        if(nums.size() == 0 || nums.size() == 1)
            return nums;
        int i = 0;
        int ou = 0;
        int jishu = 1;
        int size = nums.size();
        vector<int> ret(size);
        for(i = 0; i < size; i++)
        {
            if((nums[i] % 2) == 0)
            {
                ret[ou] = nums[i];
                ou = ou + 2;
            }
            else
            {
                ret[jishu] = nums[i];
                jishu = jishu + 2;
            }
        }
        return ret;
    }
};

 

### 奇偶排序的实现 奇偶排序可以通过多种方法来完成,在 C 语言中通常采用“双指针”策略,这种方法能够高效地将数组中的奇数偶数分开[^4]。以下是基于此策略的一种具体实现方式: #### 实现代码 ```c #include<stdio.h> // 打印数组函数 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } // 移动奇偶数的函数 void rearrangeOddEven(int arr[], int size) { int left = 0, right = size - 1; while (left < right) { // 左侧寻找偶数 while (arr[left] % 2 != 0 && left < right) { left++; } // 右侧寻找奇数 while (arr[right] % 2 == 0 && left < right) { right--; } if (left < right) { // 交换找到的偶数奇数 int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; int size = sizeof(arr) / sizeof(arr[0]); printf("原始数组:\n"); printArray(arr, size); rearrangeOddEven(arr, size); printf("重新排列后的数组(奇数在前):\n"); printArray(arr, size); return 0; } ``` 上述代码实现了将数组中的奇数放在前面,偶数放在后面的功能。其中 `rearrangeOddEven` 函数采用了双指针法,分别从左端和右端扫描数组,并根据条件进行元素交换。 --- ### 关键点解析 1. **双指针的作用** 使用两个指针变量 `left` 和 `right` 来遍历数组。`left` 指向当前左侧尚未处理的部分,而 `right` 则指向右侧未处理部分。当发现不符合顺序的元素时(即左边遇到偶数或右边遇到奇数),则执行交换操作。 2. **循环终止条件** 循环会在 `left >= right` 的情况下结束,这意味着整个数组已经被完全检查过一次。 3. **时间复杂度分析** 此算法的时间复杂度为 O(n),因为每个元素最多被访问两次(一次由 `left` 访问,另一次由 `right` 访问)。空间复杂度为 O(1),因为它只使用了常量级额外存储空间。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值