问题·描述
输入一个数组(可以是任意元素数组),实现一个函数来调整该数组的元素的顺序。使得所有满足这个“条件”
这个条件,可以是任意形式的;例如,是奇偶性,能被某数整除;然后又或者正负数
原书中给出的方法类似于快速排序:
依据所给的条件可以,设置function;(内置操作)
然后调用函数指针操作即可
使用:
vector< int >::iterator begin = array.begin() ;
vector< int >::iterator end = array,end();
func(*begin)
func(*end)
下面给出剑指offer,问题21具体求解
问题·描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变
方法一:
(1)
时间复杂度:
O(n^2) 直接暴力求解
// 冒泡法
class Solution {
public:
void reOrderArray(vector<int> &array) {
for (int i = 0; i < array.size(); i++)
{
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]);
}
}
}
}
};
(2)改进
//快排
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int>::iterator begin = array.begin();
vector<int>::iterator end = array.end();
while (begin < end)
{
while (begin < end && (*begin & 0x1) == 1)
begin++;
while (begin < end && (*end & 0x1) == 0)
end--;
if (begin < end)
{
int temp = *begin;
*begin = *end;
*end = temp;
}
}
}
};
// 但是不能AC,还没有找到原因
方法二:
(1)空间复杂度
O(1): 无额外消耗
// vector 操作
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int>::iterator even = array.begin();
int size = array.size();
for (int i = 0; i < size; ++i)
{
if (*even % 2 == 0)
{
int tmp = *even;
even = array.erase(even);
array.push_back(tmp);
}
else {
even++;
}
}
}
};
(2)创建额外vector
将需要移动的元素,取出并删除; 然后添加进新vector,然后合并两个vector
空间复杂度 O(n)
// 设置额外的数组空间
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> assist;
vector<int>::iterator it1, it2;
it1 = array.begin();
for (; it1 != array.end();)
{
if (*it1 & 0x1 == 0) { // 将所有的偶数取出,并删除
assist.push_back(*it1);
it1 = array.erase(it1);
}
else {
it1++;
}
}
vector<int>::iterator it3, it4;
it3 = assist.begin();
it4 = assist.end();
for (; it3 != it4; ++it3)
{
array.push_back(*it3);
}
}
};