调整数组顺序使奇数位于偶数前面
调整后奇数相对位置不变,偶数相对位置不变。可以先找到第一个偶数所在位置和最后一个奇数所在位置,然后把偶数一次次向后移动,空出来的第一个位置用来填充最近的一个奇数,直到把最后一个奇数填充到空出来的位置为止。
1 class Solution { 2 public: 3 void reOrderArray(vector<int> &array) { 4 if(array.size()<=1) 5 return; 6 int len=array.size(); 7 int oddi=-1; 8 int eveni=-1; 9 for(int i=0;i<len;i++) 10 { 11 if(eveni==-1&&array[i]%2==0) 12 { 13 eveni=i; 14 break; 15 } 16 } 17 for(int i=len-1;i>=0;i--) 18 { 19 if(oddi==-1&&array[i]%2==1) 20 { 21 oddi=i; 22 break; 23 } 24 } 25 while(eveni<oddi) 26 { 27 int index; 28 int tmp1=array[eveni]; 29 int tmp2; 30 for(index=eveni+1;index<=oddi;index++) 31 { 32 if(array[index]%2==0) 33 { 34 tmp2=array[index]; 35 array[index]=tmp1; 36 tmp1=tmp2; 37 } 38 else 39 { 40 tmp2=array[index]; 41 array[index]=tmp1; 42 array[eveni]=tmp2; 43 break; 44 } 45 } 46 if(index==oddi) 47 break; 48 eveni++; 49 } 50 return; 51 } 52 };
如果不需要保持相对位置不变,那就简单了,可以在O(n)时间完成移动。