输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
https://www.nowcoder.com/practice/beb5aa231adc45b2a5dcc5b62c93f593?tpId=13&tqId=11166&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
这题如果没有保证相对位置不变就很简单,需要保证相对位置的话,需要额外的努力。
1.允许额外空间
再申请一块数组,扫描两遍原数组,一遍将奇数放进去,一遍将偶数放进去。
2.不允许额外空间
思路这样:从左向右,找到第一个不符合位置的奇数,把它前面的偶数向后搬一位,再把它放入空出的位置。感觉和插入排序很像。
class Solution {
public:
void reOrderArray(vector<int> &array) {
int sz = array.size();
if (sz <= 1)
return;
int p1 = 0, p2 = 0;//p1指向的是已排好序的奇数的下一个位置,p2指向的是下一个检查的位置
while (p2 < sz) {
if (array[p2] % 2 == 0) {
++p2;
}
else {
if (p1 == p2) {
++p1;
++p2;
}
else {
for (int i = p2; i > p1; --i)
swap(array[i], array[i-1]);
++p1;
++p2;
}
}
}
}
};