1. 题目描述

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

2. 思路描述

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

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

3. 代码实现

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

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
/**
* 交换数组元素
* @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))