题目描述

  输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
  这道题花了我大半天的时间来完成。总结一下,大概分为两种算法。
    第一种算法,就是新建数组。这又分为两种情况。(1)遍历两次,遍历时候直接把数组中的数据放入数组中。第一次遍历,先找到所有的奇数,把它们依次放入数组中。然后再遍历一遍,再把所有的偶数放进去,这样我们就能得到所有重排过的数组。这种方法的不足是遍历两遍,空间复杂度有些高。(2)仍然是新建数组,但这次我们只需要遍历一次。在遍历过程中遇到偶数,就存入新的数组中,并在原数组中删除该数。遇到奇数,不处理,指针继续后移。最后将新数组整体添加到原来数组后面即可。
    第二种算法,利用我们了解的排序算法。同样分为两种情况。(1)类似于冒泡排序,我们遍历数组,将前偶后奇的数交换。这个没有具体验证。(2)类似于插入排序。我们利用两个指针,第一个指针从左向右搜索,找到第一个偶数,第二个指针从第一个指针的后一个开始搜索,找到第一个奇数,两个指针之间全部都是偶数,将【第一指针,第二指针-1】,整体后移,然后将第二个指针找到的奇数放入到原来第一指针位置,然后第一指针继续后移,直到第二指针查找到最后一个元素,循环结束。
  第一种情况的1,2,以及第二种情况的2,本人都具体验证过,现附上代码如下。
#include<iostream>
#include<vector>
#include<iterator>
using namespace std;
void show(vector<int> &array)
{
    for (auto i : array)
        cout << i << " ";
    cout << endl;
}
//方法1,遍历两次,先放奇数,再放偶数
void reOrderArray(vector<int> &array)
{
    vector<int> result;
    if (array.size() == 0)
        cout << "The array is null" << endl;
    int num = array.size();
    for (int i = 0; i < num; i++)
    {
        if (array[i] % 2 == 1)
            result.push_back(array[i]);
    }
    for (int i = 0; i < num; i++)
    {
        if (array[i] % 2 == 0)
            result.push_back(array[i]);
    }
    array = result;
    show(array);
}
//方法2:新建一个数组,遍历一遍数组,奇数不动,将偶数存入新数组中,并在原来数组中删除
//         最后将新数组加在原来数组后面
void reOrderArray1(vector<int> &array)
{
    vector<int> temp;
    vector<int>::iterator ib = array.begin();
    while (ib != array.end())
    {
        if ((*ib) %2 == 0)
        {
            temp.push_back(*ib);
            ib = array.erase(ib);
        }
        else
            ib++;
    }
    vector<int>::iterator beg = temp.begin();
    vector<int>::iterator end = temp.end();
    for (; beg != end; beg++)
    {
        array.push_back(*beg);
    }
    show(array);
}
//方法3,类似插入排序。先找到第一个偶数,然后再找到第一个奇数,将这段范围值整体后移,
//         将找到的第一个奇数放到第一个偶数的位置
void reOrderArray2(vector<int> &array)
{
    if (array.size() == 0)
        cout << "The array is null";
    int i = 0, j;
    int l = array.size();
    while(i < l)
    {
        while (i < l && (array[i] % 2 == 1))
        {
            i++;
        }    
        j = i + 1;
        while (j < l && (array[j] % 2 == 0))
        {
            j++;
        }            
        if (j < l)
        {
            int temp = array[j];
            for (int m = j - 1; m >= i; m--)
            {
                array[m + 1] = array[m];
            }
            array[i++] = temp;
        }
        else
            break;
    }
    show(array);
}
int main()
{
    vector<int> arr = { 1,2,3,4,5,6,7,8 };
//    reOrderArray(arr);
//    reOrderArray1(arr);
    reOrderArray2(arr);
    system("pause");
    return 0;
}