题目:
题目1:输入一个整数数组,实现函数使得数组奇数位于数组前半部分,所有偶数位于数组后边部分。
题目2:输入一个整数数组,实现函数使得数组奇数位于数组前半部分,所有偶数位于数组后边部分。并保证原数组的相对位置不变。
解法
题目1:
1、利用两个指针left,right。分别从左和从右寻找奇数偶数进行交换即可。
代码如下:
void reOrderArray(vector<int> &array) {
if(array.empty()||array.size()==0)
return;
int left = 0;
int right = n-1;
while(left<right)
{
while(left<n && array[left]%2==1)
left++;
while(left<n && array[right]%2==0)
right--;
if(left<right)
swap(array[left],array[right]);
}
}
题目2:
1、为保证相对位置的有序,利用插排思想进行相邻位置的比较。时间复杂度o(n^2)
2、利用辅助空间,例如两个vector,遍历数组一次,分别取出奇数偶数。在一起合并后返回.时间o(n) 空间0(n)
代码1如下
void reOrderArray(vector<int> &array) { //类似插排
if(array.empty())
return ;
int first;//存放第一个奇点在原数组的位置
int index=-1;//存放 调整好的最后一个奇点的位置
//寻找第一个奇点
int n = array.size();
for(int i = 0;i<n;i++)
{
if(array[i]%2 == 1)
{
int temp = array[i];
first = i ;
for(int j = first ;j>index+1;j--)
array[j] = array[j-1];
array[index+1] = temp;
index++;
break;
}
}
for(int i = first+1;i<n;i++) //寻找后面的奇点
{
if(array[i] % 2 ==1)
{
int temp = array[i];
int temp_index = i;
for(int j = temp_index;j>index+1;j--)
array[j] = array[j-1];
array[index+1] = temp;
index++;
}
}
}
代码2如下
void reOrderArray(vector<int> &array) {
if(array.empty()||array.size()==0)
return;
vector<int> ji;
vector<int> ou;
for(int i =0;i<array.size();i++)
{
if(array[i]%2==0)
ou.push_back(array[i]);
else
ji.push_back(array[i]);
}
array.clear();
for(int i = 0;i<ji.size();i++)
array.push_back(ji[i]);
for(int i = 0;i<ou.size();i++)
array.push_back(ou[i]);
}