输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:循环遍历数组,找到偶数奇数的序列则对调。当循环一遍无这种序列时,则不需要再循环。
备注:a&1==0 则a为偶数; a&1==1,a为奇数
如果不要求相对位置不变,可以两个指针,一个p从前向后找偶数,一个q从后向前找奇数,找到后对调。
核心伪代码:
while(p<q){
while(p<q && p.value&1==1){ p++;}
while(p<q && p.value&1==0){ q--;}
if(p<q){
交换p,q所指向的值;
}
}
设计测试用例:
int arr[]={1,2,3,4,5,6,7,8,10,11,13};
//int arr[]={1,2,3,4,5,6};
//int arr[]={1,2,3,5,7};
//int arr[]={4,2,8,0,18};
//int arr[]={1,5,3,9,7};
package com.mytest.mymain;
public class Reorderarr {
public static void main(String[] args) {
int arr[]={1,2,3,4,5,6,7,8,10,11,13};
//int arr[]={1,2,3,4,5,6};
//int arr[]={1,2,3,5,7};
//int arr[]={4,2,8,0,18};
//int arr[]={1,5,3,9,7};
reOrderArray(arr);
for (int i : arr) {
System.out.print(i+" ");
}
}
public static void reOrderArray(int [] array) {
boolean flag=true;
while(flag){
int count=0;
for(int i=0;i<array.length-1;i++)
{
if((array[i]&1)==0 && (array[i+1]&1)==1)//偶数,奇数
{
int temp=array[i];
array[i]=array[i+1];
array[i+1]=temp;
flag=true; //还需要检查
count++;
}
}
if(count==0)
flag=false;
}
}
}