CodingInterview-调整数组顺序使奇数位于偶数前面

这道题在牛客网中增加了难度,要求偶数和偶数之间的相对位置不变,而书中的解法会出现相对位置改变的问题,所以应该进行改进。

改进的思路和插入排序很像。从左到右,先找到一个偶数,然后在偶数后面去寻找一个奇数。如果找到了这个奇数,就去当前偶数和奇数之间的数字都向右移动一位,然后将奇数插入到移位后空出来的最前面。

因为题目直接引用传入了一个 vector,所以用空间换时间再加一个新的 vector 的思路可能不太符合题意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
void reOrderArray(vector<int> &array) {
int len=(int)(array.size());
if(len<=0) return;
int pEven=0;
int pOdd;
while(pEven<len){
while(pEven<len && (array[pEven]&1)!=0) pEven++;
pOdd=pEven+1;
while(pOdd<len && (array[pOdd]&1)==0) pOdd++;
if(pOdd<len){
int t=array[pOdd];
for(int i=pOdd;i>pEven;i--){
array[i]=array[i-1];
}
array[pEven]=t;
}else break;
}
}
};