1. 题目描述

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

2. 思路描述

这题进一步抽象就是满足一定条件的元素都移动到数组的前面,不满足的移动到后面。所以,需要有一个参数用来传递判断函数

最优解法就是数组两头分别有一个指针,然后向中间靠拢。符合条件,就一直向中间移动;不符合条件,就停下来指针,交换两个元素;然后继续移动,直到两个指针相遇。

3. 代码实现

函数change运用了设计模式中的“桥接模式”,判断条件由用户自己定义。

/**
 * 交换数组元素
 * @param {Array} arr
 * @param {Number} i
 * @param {Number} j
 */
const swap = (arr, i, j) => ([arr[i], arr[j]] = [arr[j], arr[i]]);

/**
 * 将符合compareFn要求的数据排在前半部分,不符合要求的排在后半部分
 * @param {Array} brr
 * @param {Function} compareFn
 * @return {Array}
 */
function change(brr, compareFn) {
  const arr = [...brr],
    length = brr.length;
  let i = 0,
    j = arr.length - 1;
  while (i < j) {
    while (i < length && compareFn(arr[i])) ++i;
    while (j >= 0 && !compareFn(arr[j])) --j;

    if (i < j) {
      swap(arr, i, j);
      ++i;
      --j;
    }
  }
  return arr;
}

/**
 * 测试代码
 */

const isOdd = num => (num & 1) === 1;
console.log(change([1, 2, 3, 4], isOdd));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38