题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
错误代码:
public class Solution { public void reOrderArray(int [] array) { int len=array.length; for(int i=0;i<len;i++){ if((array[i]&1)==0){ int j; for(j=i;j<len-1;j++) array[j]=array[j+1]; int temp; temp=array[i]; array[j]=temp; i--; } } } }
这段代码,i-- 这个语句,会导致死循环。因为,到了数组某一阶段,i及其以后全是偶数,会一直循环,而且破坏稳定性。
改正:
public class Solution { public void reOrderArray(int [] array) { int len=array.length; int k=0; for(int i=0;i<len-k;i++){ int temp; temp=array[i]; if((array[i]&1)==0){ int j; for(j=i;j<len-1;j++) array[j]=array[j+1]; array[j]=temp; i--; k++; } } } }
这段代码,增加一个k,限制i的循环次数。关键是,i不需要遍历到最后。另外,如果想要让奇数向前,可以仿照上述代码,从后面遍历。
再有,完全仿照直接插入排序,奇数向前,同时从0遍历,注意一点:找到奇数后,要从第一个偶数开始向后搬运,再将奇数插入到原来第一个偶数的位置。
public class Solution { public void reOrderArray(int [] array) { int len=array.length; for(int i=0;i<len;i++){ if((array[i]&1)==1){ int k=0; while((array[k]&1)==1&&k<i) k++; //找到前面第一个偶数 if(k<i){ int temp=array[i]; int j; for(j=i;j>k;j--) array[j]=array[j-1]; array[j]=temp; } } } } }
以上的时间复杂度是O(n2),如果再借用一个数组,将偶数放进去,然后再复制到原来的数组中,可实现时间复杂度为O(n)的算法