大师兄

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));