调整数组使得奇数都在前面,偶数都在后面(可扩展到其他形式,如正负等)
分析:可以使用时间复杂度为O(n),空间复杂度也为O(n)的插入算法。新建一个和原来数组一样大小的数组,再遍历数组中的每个元素,如果是奇数,则插入数组的前半部分,如果是偶数,则插入数组的后半部分,这样就可以看成是两端不断往中间扩展直至前后两端相接触为止。
具体代码如下:
package problem2;
/**
* @author Hutongling
*/
public class 调整数组使奇前偶后 {
//时间复杂度为o(n),空间复杂度为o(n)
static void adjustArray1(int[] data){
if(data==null || data.length==0)
return ;
int A[]=new int[data.length];
int count1=0;
int count2=data.length-1;
for(int i=0;i<data.length;i++){
if((data[i]%2)!=0) //当为奇数的时候直接插到前面,从前往后走
{
A[count1]=data[i];
count1++;
}
if((data[i]%2)==0) //当为偶数的时候直接插到后面,从后面往前面走,因为不需要考虑偶数内部的顺序,故这样是可以的
A[count2--]=data[i];
}
// for(int i=0;i<data.length;i++){ //处理偶数的情况,按顺序处理,从前往后走
// if((data[i]%2)==0)
// A[count1++]=data[i];
// }
for(int i=0;i<data.length;i++)
System.out.print(A[i] + " ");
System.out.println();
}
public static void main(String[] args) {
int data[]={10,3,5,2,4,6,8,9};
int data1[]={1,3,5,2,4,6,8,9,1};
int data2[]={3,3,15,12,14,36,18,39,14};
adjustArray1(data);
adjustArray1(data1);
adjustArray1(data2);
}
}
结果如下:
3 5 9 8 6 4 2 10
1 3 5 9 1 8 6 4 2
3 3 15 39 14 18 36 14 12