输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
这道题原题是不需要保证奇偶数相对位置不变,我们可以先思考这个问题可以怎么解决。
解决思路:分别定义left和right指向数组的第一个元素和最后一个元素,当left指向偶数,right指向奇数时交换两个元素就可以完成排序。
但是现在我们所考虑的是要使得奇偶数相对位置不变不变,我们可以借鉴插入排序的思想。这里只需要定义left,则从左向右遍历,每次遇到的都一定是最前面的奇数,所以可以先将当前的奇数保存起,将该奇数之前的偶数整体向后移动一个位置。
注意:之前保存的奇数还应该在原来的位置,这样就可以保证其相对位置不变。
代码如下:
public class Solution {
public void reOrderArray(int [] array) {
if(array == null){
return;
}
int k = 0;
for(int left = 0;left < array.length;left++){
if((array[left] & 1) == 1){//说明是奇数
int tmp = array[left];
int j = left;
while(j > k){
array[j] = array[j - 1];
j--;
}
array[k++] = tmp;
}
}
}
}