剑指offer-调整数组顺序使奇数位于偶数前面
题目:调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:这道题应该是考察排序的,相对位置不变意味着排序算法要稳定
但是如果允许额外开辟空间的话,只需新建一个数组,将原数组的奇数放到新数组前面,偶数放到后面,便可以达到时间复杂度O(n),空间复杂度O(N)
那么,先来开个数组,暴力解下:
1 public class Solution { 2 public void reOrderArray(int [] array) { 3 int oddStart=0; 4 int count=0; 5 int []a=new int[array.length]; 6 for(int i=0;i<array.length;i++){ 7 if((array[i]&1)==1) count++; 8 } 9 for(int i=0;i<array.length;i++){ 10 if((array[i]&1)==1)a[oddStart++]=array[i]; 11 else{ 12 a[count++]=array[i]; 13 } 14 } 15 for(int i=0;i<array.length;i++){ 16 array[i]=a[i]; 17 } 18 } 19 }
思路:用类似于插入排序的思想,先寻找第一个奇数,从该奇数的位置往前找,只要有偶数出现,就交换这两个数的位置
对于插入排序,最坏情况需要N^2/2 次比较和N^2/2次交换
最好情况需要N-1次比较和0次交换
1 public class Solution { 2 public void reOrderArray(int [] array) { 3 int odd=0;int even=0; 4 for(int i=1;i<array.length;i++){ 5 if((array[i]&1)==1){ 6 for(int j=i;j>0;j--){ 7 if((array[j-1]&1)!=1){ 8 int tmp=array[j]; 9 array[j]=array[j-1]; 10 array[j-1]=tmp; 11 } 12 } 13 } 14 } 15 } 16 }
看了下排名靠前的算法,下面这种毫无算法思想而言的解法居然也能排进前十
1 import java.util.ArrayList; 2 import java.util.List; 3 public class Solution { 4 public void reOrderArray(int [] array) { 5 List<Integer>ls1=new ArrayList<Integer>(); 6 List<Integer>ls2=new ArrayList<Integer>(); 7 for(int i=0;i<array.length;i++){ 8 if(array[i]%2==1){ 9 ls1.add(array[i]); 10 } 11 else { 12 ls2.add(array[i]); 13 } 14 } 15 ls1.addAll(ls2); 16 for(int i=0;i<array.length;i++){ 17 array[i]=ls1.get(i); 18 } 19 } 20 }
排名第一的,居然是冒泡,是测试的数据量不够大么
1 public class Solution { 2 public void reOrderArray(int [] array) { 3 for(int i= 0;i<array.length-1;i++){ 4 for(int j=0;j<array.length-1-i;j++){ 5 if(array[j]%2==0&&array[j+1]%2==1){ 6 int t = array[j]; 7 array[j]=array[j+1]; 8 array[j+1]=t; 9 } 10 } 11 } 12 } 13 }