# 题目描述

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

# 解题思路

解法一

  1. 第一个指针start从数组第一个元素出发,向尾部前进

  2. 第二个指针end从数组的最后一个元素出发,向头部前进

  3. start遍历到偶数,end遍历到奇数时,交换两个数的位置

  4. 当start>end时,完成交换

解法二

  1. 给数组重新设置排序规则compare
  2. compare函数中用ab的值对2除余,然后返回b的余数减a的余数

# coding

解法一

function reOrderArray1(array) {
    if (Array.isArray(array)) {
        let start = 0;
        let end = array.length - 1;
        while (start < end) {
            while (array[start] % 2 === 1) {
                start++;
            }
            while (array[end] % 2 === 0) {
                end--;
            }
            if (start < end) {
                [array[start], array[end]] = [array[end], array[start]]
            }
        }
    }
    return array;
}

解法一会改变原数组的相对顺序,若要保证相对顺序,则需要让两个指针同时从左侧开始。

解法二

function reOrderArray2(array) {
    if (Array.isArray(array)) {
        return array.sort(compare)
    }
}
function compare(a, b) {
    let rA = a % 2,
        rB = b % 2;
    return rA === rB ? 1 : rB - rA
}

测试代码

console.log(reOrderArray1([2, 6, 1, 3, 4, 5]))
// [5, 3, 1, 6, 4, 2]
console.log(reOrderArray2([2, 6, 1, 3, 4, 5]))
// [1, 3, 5, 2, 6, 4]
阅读全文