题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路:
1 第一种想简单了 没有保证相对位置不变, 用两个指针 一前一后,前面的指针遇到偶数 停下来 后面的指针遇到奇数停下来 然后两个 交换 ,直至前指针的位置比后指针的位置还要后。
2 第二种 想用两个临时数组去保存原数组中的奇数和偶数,就是先遍历 一遍原数组 然后将奇数放到临时数组1中 偶数放到临时数组2中 ,再遍历一遍 原数组 先用临时数组1赋值,再用临时数组2 赋值。 时间复杂度是 O(2n)
3 是最原始的方法 ,遇到偶数的话 将之后的数都往前挪一个,这个偶数赋值到最后。这个时间复杂度是O(n^2),我想法是 数组插入删除比较麻烦 ,能不能借用一个链表,使用迭代器记录链表中最后一个奇数的位置,遇到原数组的偶数给链表尾插,遇到奇数王迭代器位置插,当数组遍历完之后 链表中的元素就是 保证了相对位置的 奇数在前 偶数在后。 然后再用链表给 数组赋值。
4 第四种方法 借用冒泡的思想,从数组的最后开始寻找 如果遇到偶数再奇数之前的 让偶数和奇数交换,简而言之就是让奇数像泡泡一样冒上来。
#include <list>
class Solution {
public:
void reOrderArray(vector<int> &array) {
bool flag=true;
int length=array.size();
for(int i = 0;i < length && flag;i++){
bool flag=false;
for(int j = array.size()-1; j>i;j--){
if(array[j]%2==1&&array[j-1]%2==0)
{ swap(array[j],array[j-1]);
flag=true;
}
}
}
/*
list<int> _list;
list<int>::iterator iter_temp= _list.begin();
vector<int>::iterator iter1=array.begin();
vector<int>::iterator iter2=array.end();
while(iter1<=iter2)
{
if(*iter1%2==0)
_list.push_back(*iter1);
else
{_list.insert(iter_temp,*iter1);iter_temp++;}
iter1++;
}
iter_temp= _list.begin();
for(iter1=array.begin();iter1<=iter2;++iter1,iter_temp++)
{
*iter1=*iter_temp;
}
*/
/*
vector<int> arr_1;
vector<int> arr_2;
vector<int>::iterator iter1=array.begin();
vector<int>::iterator iter2=array.end();
while(iter1<=iter2)
{
if(*iter1%2==0)
arr_2.push_back(*iter1);
else
arr_1.push_back(*iter1);
iter1++;
}
vector<int>::iterator iter_temp=arr_1.begin();
for(iter1=array.begin();iter_temp<=arr_1.end();++iter1,++iter_temp)
{
*iter1=*iter_temp;
}
for(iter_temp=arr_2.begin();iter_temp<=arr_2.end();++iter1,++iter_temp)
{
*iter1=*iter_temp;
}
*/
/*
vector<int>::iterator iter1=array.begin();
vector<int>::iterator iter2=array.end();
while(iter2>iter1)
{
while(iter1<iter2&&*iter1%2!=0)
iter1++;
while(iter1<iter2&&*iter2%2!=1)
iter2--;
if(iter1!=iter2)
{
int temp=*iter1;
*iter1=*iter2;
*iter2=temp;
iter1++;
iter2--;
}
}
*/
}
};