调整数组顺序使奇数位于偶数前面(奇数和偶数相对位置不变)

题目描述

  输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
  思路:要保持奇数和偶数的相对位置不变并且达到O(n)的时间复杂度的话,必须要用O(n)的辅助空间。
 1 class Solution {
 2 public:
 3 void reverseArray(vector<int> &array, int begin)
 4 {
 5     int end=array.size()-1;
 6     while(begin<end)
 7     {
 8         int tmp=array[begin];
 9         array[begin]=array[end];
10         array[end]=tmp;
11         ++begin;
12         --end;
13     }
14 }
15 void reOrderArray(vector<int> &array)
16 {
17     if(array.size()<=1)return;
18     vector<int> tmp=array;
19     int left=0, right=array.size()-1;
20     for(int i=0; i<tmp.size(); ++i)
21     {
22         if(tmp[i] & 1)array[left++]=tmp[i];
23         else array[right--]=tmp[i];
24     }
25     reverseArray(array, right+1);//将偶数部分逆序
26 }
27 };

  不使用辅助空间的话,只能实现O(n^2)的时间复杂度。首先寻找第一个奇数,并将其放在0号位置。然后将第一个奇数之前的元素全部往后移一位。然后在第一个奇数之后的元素中寻找奇数,并做移动操作。就可以保证原来的相对顺序。

 1 class Solution {
 2 public:
 3 void reOrderArray(vector<int> &array)
 4 {
 5     if(array.size()<=1)return;
 6     for(int i=0; i<array.size(); ++i)
 7     {
 8         int j=i;
 9         while(!(array[j] & 1) && j<array.size())++j;
10         if(j==array.size())return;
11         int tmp=array[j];
12         while(j>i)
13         {
14             array[j]=array[j-1];
15             --j;
16         }
17         array[i]=tmp;
18     }
19 }
20 };

 

 

posted @ 2017-12-22 21:32  jeysin  阅读(492)  评论(0)    收藏  举报