数组奇偶划分

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。

情况一

不需要保证奇数和偶数之间相对位置不变。
这里可以用快排的思想。时间复杂度为O(n)

public static int[] reOrderArray(int[] array) {
        int left = 0;
        int right = array.length - 1;
        while (left < right) {
            while (left < right && array[left] % 2 == 1) {
                left++;
            }
            while (left < right && array[right] % 2 == 0) {
                right--;
            }
            int tmp = array[left];
            array[left] = array[right];
            array[right] = tmp;
        }
        return array;
    }

情况二

保证奇数和奇数,偶数和偶数之间的相对位置不变。

(1)新建一个数组,时间复杂度为O(n),空间复杂度为O(n)

public static int[] reOrderArray(int[] array) {
        int[] result = new int[array.length];
        int j = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] % 2 == 1) {
                result[j] = array[i];
                j++;
            }
        }
        for (int i = 0; i < array.length; i++) {
            if (array[i] % 2 == 0) {
                result[j] = array[i];
                j++;
            }
        }
        return result;
    }

(2)利用插入排序的思想,时间复杂度为O(n^2),空间复杂度为O(1)

public void reOrderArray(int [] array) {
        for(int i=1;i<array.length;i++){
            if(array[i]%2==1){
                int tmp=array[i];
                int j=i-1;
                while(j>=0 &&array[j]%2==0){
                    array[j+1]=array[j];
                    j--;
                }
                array[j+1]=tmp;
            }
        }

    }
### 通过索引奇偶数组 JavaScript 提供多种方式将数组割为两个数组,其中一种常见做法是根据索引的奇偶性进行划分。此方法适用于任何类型的元素集合,并能确保数据均匀布。 ```javascript function splitArrayByIndex(arr) { const even = []; const odd = []; for (let i = 0; i < arr.length; i++) { if (i % 2 === 0) { even.push(arr[i]); } else { odd.push(arr[i]); } } return { even, odd }; } // 示例调用 const data = [10, 20, 30, 40, 50]; const { even, odd } = splitArrayByIndex(data); console.log("偶数索引项:", even); // [10, 30, 50] console.log("奇数索引项:", odd); // [20, 40] ``` 该实现基于 `for` 循环,逐项判断索引奇偶性并归类至不同数组中。这种方式具有良好的性能表现,在处理大型数据集时较为高效[^1]。 ### 使用 reduce 实现列 另一种函数式编程风格的方法是利用 `reduce()` 函数一次性遍历数组,并在过程中将元素按索引奇偶类到两个容器中。 ```javascript function splitArrayUsingReduce(arr) { return arr.reduce( (acc, item, index) => { index % 2 === 0 ? acc.even.push(item) : acc.odd.push(item); return acc; }, { even: [], odd: [] } ); } ``` 此方法在逻辑上更为紧凑,适合对代码结构有要求的项目,且执行效率与 `for` 循环相近[^1]。 ### 利用 filter 方法简化代码 如果更倾向于声明式语法,可使用两次 `filter()` 操作别提取偶数索引和奇数索引的元素。虽然代码简洁,但其时间复杂度为 O(2n),因此不推荐用于非常大的数组。 ```javascript const splitArrayUsingFilter = (arr) => ({ even: arr.filter((_, index) => index % 2 === 0), odd: arr.filter((_, index) => index % 2 !== 0) }); ``` 这种方法以牺牲一定的性能换取了更高的可读性和开发效率。 ### 注意事项与扩展应用 - **空数组处理**:若输入为空数组,则返回两个空数组作为默认结果。 - **稀疏数组行为**:即使数组中存在未定义值,这些位置仍会被保留。 - **边界情况处理**:当数组长度为 1 时,奇数索引数组会是空数组。 - **性能比较**: - `for` 循环方法在性能测试中表现最佳; - `filter()` 因需要遍历两次,效率较低; - `reduce()` 介于两者之间,适合注重代码结构清晰度的场景。 ### 扩展示例:转换为二维矩阵输出 可以将割后的数组组合成一个二维数组,便于后续操作或渲染。 ```javascript const matrix = [even, odd]; console.log(matrix); // [[10, 30, 50], [20, 40]] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值