剑指offer——23调整数组顺序使奇数位于偶数前面

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
 
题解:
  一种是数字的相对位置不变,即1,2,3,4  -》 1,3,2,4 
  这样只能使用额外空间了,牛客题解就是这个
  
 1 class Solution {
 2 public:
 3     void reOrderArray(vector<int> &array) {
 4         if (array.size() < 2)return;
 5         vector<int>eventV;
 6         int oddPot = 0;
 7         for (int i = 0; i < array.size(); ++i)
 8         {
 9             if (array[i] & 0x01 != 0)//奇数
10             {
11                 array[oddPot] = array[i];
12                 ++oddPot;
13             }
14             else
15                 eventV.push_back(array[i]);
16         }
17         for (int i = 0; i < eventV.size(); ++i)
18             array[oddPot++] = eventV[i];
19     }
20 };

  另一种优化的方法,就是使用头尾双指针,一旦头指针为偶数,尾指针为奇数,则立即交换,不用任何额外空间,遍历一遍完事,但相对位置会改变

  

 1 class Solution01 {
 2 public:
 3     void reOrderArray(vector<int> &array) {
 4         if (array.size() < 2)return;
 5         int L = 0, R = array.size() - 1;
 6         while (L < R)
 7         {
 8             if (func(array[L]))//是奇数
 9                 ++L;
10             if (!func(array[R]))//是偶数
11                 --R;
12             if (!func(array[L]) && func(array[R]))
13             {
14                 swap(array[L], array[R]);
15                 ++L;
16                 --R;
17             }
18         }
19     }
20     bool func(int x)
21     {
22         return x & 0x01;
23     }
24 };
原文地址:https://www.cnblogs.com/zzw1024/p/11668476.html