调整数组顺序使奇数位于偶数前面
Posted 做1个快乐的程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调整数组顺序使奇数位于偶数前面相关的知识,希望对你有一定的参考价值。
描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题目分析:针对本题,我们有不同的方法来解决,本题中保证奇数和偶数之间的相对位置不变是一个难点,读者们可以分别考虑两种情况:a-相对位置变化;b-相对位置不变。
法一:我们很容易想到的一个方法就是对数组进行遍历,此时借助一个辅助数组newarray,遍历第一遍数组找出奇数,挨个尾插到newarray中,然后再遍历一遍,找出所有的偶数依次尾插,但是该方法不管是空间复杂度还是时间复杂度都是不推荐的。
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> newarray;
//遍历第一遍找出所有的奇数
for(const auto& val : array)
{
if(val % 2 != 0)
newarray.push_back(val);
}
//遍历第二遍找出所有的偶数
for(const auto& val : array)
{
if(val % 2 == 0)
newarray.push_back(val);
}
//赋值重载
array = newarray;
}
};
法二:我们还是malloc一块和array大小一样的空间newarray,然后定义start和end两个变量,start指向array数组的头,end指向array的尾,让start从头找奇数,找到并从newarray的头依次向后插入,end从尾找偶数,找到并从newarray的尾依次向前插入。
start找奇数的过程如下:(部分)
end找偶数的过程如下:(部分)
class Solution {
public:
void reOrderArray(vector<int> &array) {
//开辟和array大小一样的数组newarray
vector<int> newarray(array.size());
//定义start和end两个变量
int start = 0;
int end = array.size() - 1;
//start从头部开始找奇数,并从newarray的头部依次向后插入
int count = 0;
while(start < array.size())
{
if(array[start] % 2 != 0)
newarray[count++] = array[start];
start++;
}
//end从尾部开始找偶数,并从newarray的尾部依次向前插入
int sz = array.size();
while(end >= 0)
{
if(array[end] % 2 == 0)
newarray[--sz] = array[end];
end--;
}
array = newarray;
}
};
法三:借助法二的方法,我们还是定义end和start,不过这时start和end同时去找奇数和偶数,start从头找奇数,找到便停下,end从尾找偶数,找到便停下,然后交换start和end两个位置的值,循环下去,但是这种方法得到的数组奇数和偶数的相对位置发生变化了。
class Solution {
public:
void reOrderArray(vector<int> &array) {
int start = 0;
int end = array.size() - 1;
while(start < end)
{
while(((start < end) && (array[start] & 1)))
start++;
while(((start < end) && !(array[end] & 1)))
end--;
swap(array[start], array[end]);
}
}
};
法四:要想保证相对位置不变,我们可以从前往后遍历数组,把偶数后移,腾出位置,放入奇数,即每找出一个奇数,把奇数前的位置全部后移一位,然后奇数插到最前面,奇数位置调整好之后,偶数位置自然就调整好了。
下图给了调整的两种情况的图:
class Solution {
public:
void reOrderArray(vector<int> &array) {
int k = 0;
//遍历整个数组
for(int i = 0; i < array.size(); ++i)
{
//找到奇数
if(array[i] & 1)
{
//从左向右,每次遇到的,都是最前面的奇数,一定将来要被放在k下标处
int temp = array[i]; //现将当前奇数保存起来
int j = i;
while(j > k)
{
//将该奇数之前的内容(偶数序列),整体后移一个位置
array[j] = array[j-1];
j--;
}
//将奇数保存在它将来改在的位置,因为我们是从左往右放的,没有跨越奇数,所以一定是相对位置不变的
array[k++] = temp;
}
}
}
};
以上是关于调整数组顺序使奇数位于偶数前面的主要内容,如果未能解决你的问题,请参考以下文章