题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
测试用例:
[1,2,3,4,5,6,7]
对应输出应该为:
[1,3,5,7,2,4,6]
分析:
1.这个问题第一个想到的自然就是新建一个额外的数组来存放顺序调整后的数组。此方法是采取空间换时间的方法。时间复杂度为O(n)。
源码如下:
public class Test1 {
public void reOrderArray(int [] array) {
if (array.length==0||array.length==1) {//如果数组元素数量小于2,那也就不用排了
return;
}
int oddCount = 0,oddBegin=0;//此处设置两个变量作为奇数数量计数器和奇数开始的位置
int[] newArray=new int[array.length];//建一新数组存放
for (int i = 0; i < array.length; i++) {
if (array[i]%2==1) {
oddCount++;//奇数数量增加
}
}
for (int i = 0; i < array.length; i++) {
if (array[i]%2==1) {
newArray[oddBegin++] = array[i];
}else {
newArray[oddCount++] = array[i];//奇数数量也是偶数开始的位置
}
}
for (int i = 0; i < array.length; i++) {
array[i] = newArray[i];
}
}
}
2.另外一个方法就是使用插入排序,但是这个的时间复杂度为O(n2),一般是要再进行优化的。
源码如下:
public class Test1 {
public void reOrderArray(int[] array) {
if (array.length == 0 || array.length == 1) {// 如果数组元素数量小于2,那也就不用排了
return;
}
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 1) {
int temp = array[i];
int j = i - 1;
while (j >= 0 && array[j] % 2 == 0) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = temp;
}
}
}
}
运行测试:
第一种:
运行时间:16ms
占用内存:21424k
第二种:
运行时间:17ms
占用内存:21404k
总结:
考虑一个算法问题考虑算法原型确实是有必要的,但也不能拘泥于算法原型,在这次例子中,使用排序的解法反而没有第一种方法来的好。所以面对问题有时候重要的不是方法论,循规蹈矩,而是有自己 的想法,去积极地寻找规律才行=(●ˇ∀ˇ●)=