题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
解题思路是:维护两个指针,一个指向数组第一个元素start,另一个指向数组最后一个元素end,分别相向移动两个指针,当start++指针指向偶数,end--指针指向奇数,并且start<end条件,将他们位置上的数据交换,直到start和end指针产生碰撞,即start>=end结束。
上代码:
package com.xxx.algorithm.sort;
public class OddEvenSolution {
public static void swap(int[] nums){
int begin = 0,end=nums.length-1;
while(begin<end){
while(begin<end && (nums[begin]&1)==1){
begin++;
}
while(begin < end && (nums[end]&1)==0){
end--;
}
int tmp = nums[begin];
nums[begin] = nums[end];
nums[end] = tmp;
}
}
public static void print(int[] nums){
for(int i=0;i<nums.length;i++){
System.out.print(nums[i] +" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {1,3,2,4,5,7,8,9,0,3,5,3,5,6};
print(arr);
swap(arr);
print(arr);
}
}
执行数据交换的过程如下:
这不是唯一的解决办法,但是相对于普通的解决办法:直接遍历数组,然后将偶数移动到数组末端,时间复杂度要小的多。