一、相对位置可以改变
1、题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。
2、分析
不考虑相对位置,可以类比快排,用左右指针法。
left=0,从左向右遍历,若是奇数left加一,若是偶数与右边的奇数交换位置。
right=arr.length-1,从右向左遍历,若是偶数right加一,若是奇数与左边的偶数交换位置。
3、代码
public static void reOrderArray(int [] array) { int i=0; int j=array.length-1; int temp=0; while(i<j){ if ((array[i]&1)==1){ i++; continue; } if ((array[j]&1)==0) { j--; continue; } temp=array[i]; array[i]=array[j]; array[j]=temp; i++; j--; } for (int ii=0;ii<array.length;ii++){ System.out.print(array[ii]+","); System.out.println(); } }
二、相对位置不变
1、题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
2、分析
考虑到要保持相对位置,就不能用左右指针法。
(1)最简单的方法就是循环遍历两次,分别找到奇数、偶数添加到list集合中,最后再把集合中的元素添加到数组中。
(2)类似于冒泡排序,从头开始,相邻元素只要是前偶后奇就交换,不同的是内循环每次都从头开始,防止一开始就有许多连续的偶数情况
(3)
3、代码
//(1) import java.util.*; public class Solution { public void reOrderArray(int [] array) { List<Integer> list = new ArrayList(); for(int i=0;i<array.length;i++){ if((array[i]%2)==1){ list.add(array[i]); } } for(int i=0;i<array.length;i++){ if((array[i]%2)==0){ list.add(array[i]); } } for(int i=0;i<array.length;i++){ array[i] = list.get(i); } } } //(2) import java.util.*; public class Solution { public void reOrderArray(int [] array) { int temp = 0; int length = array.length; for(int i=0;i<length;i++){ for(int j=0;j<length-1;j++){ if((array[j]%2==0)&&(array[j+1]%2==1)){ temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } } } //(3) import java.util.*; public class Solution { public void reOrderArray(int [] array) { int left = 0; int right = 0; int size = array.length; while(right < size){ if(array[right] % 2 != 0){ int temp = array[right]; for(int i=right ;left<i;i--){ array[i] = array[i-1]; } array[left] = temp; right ++; left ++; }else{ right ++; } } } }