# 按奇偶排序数组
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 方法一:创建新数组,一次循环根据当前数字的奇偶依次添加到新的数组中
var sortArrayByParity = function (A) {
let len = A.length
let B = new Array(len).fill(0)
let h = 0 // 左边偶数放置的索引
let j = len - 1 // 右边奇数放置的索引
for (let i = 0; i < len; i++) {
if (A[i] % 2 === 0) {
B[h++] = A[i]
} else {
B[j--] = A[i]
}
}
return B
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 方法二:一次循环,多次交换。当循环到偶数,和前边的奇数交换位置
var sortArrayByParity = function (A) {
let i = 0 // 最左边奇数位置
for (let j = 0; j < A.length; j++) {
if (A[j] % 2 === 0) {
let c = A[i]
A[i] = A[j]
A[j] = c
i++
}
}
return A
};
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 方法三:双指针,左指针寻找奇数,右指针寻找偶数,只对需要进行交换的数据进行交换
var sortArrayByParity = function (A) {
let i = 0 // 左指针
let j = A.length - 1 // 右指针
while (i < j) {
if ((A[i] & 1) === 1 && (A[j] & 1) === 0) {
// 如果左指针对应奇数值,右指针对应偶数值,进行交换
let tmp = A[i]
A[i] = A[j]
A[j] = tmp
} else if ((A[i] & 1) === 0) {
// 如果左指针是偶数,符合条件,继续移动左指针
i++
} else if ((A[j] & 1) === 1) {
// 如果右指针是奇数,符合条件,继续移动右指针
j--
}
}
return A
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 方法四:同上,但是在实际执行中,奔溃了,循环死掉了吧
var sortArrayByParity = function (A) {
let i = 0
let j = A.length - 1
while (i < j) {
while (A[i] % 2 === 0 && i < j) i++;
while (A[i] % 2 === 1 && i < j) j++;
let tmp = A[i]
A[i] = A[j]
A[j] = tmp
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 测试用例
let x = [
1827,
584,
3670,
1942,
669,
2773,
220,
374,
4749,
353,
4695,
1727,
2656,
3619,
2302,
3939,
3943,
4231,
117,
3725,
2126,
2327,
2756,
1353,
3959,
4928
]
console.log(sortArrayByParity(x))
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
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