输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
本题思路,基本可以理解为考察排序算法,由于要求相对位置不变,则可以稳定的排序算法都可以类似的求解
常用的稳定的排序算法有:冒泡、插入、选择、归并排序
不稳定的排序算法有:快速、希尔、堆排序
类似排序的思路如下:
1. 冒泡 前偶后奇则交换
2. 插入 使用一个标记位 表示左边已经全是奇数的个数,向右遍历,遇到的第一个奇数,放到标记位上,其他的依次右移
3. 归并 申请一块新的内存 遍历一次先存奇数,再遍历一次存偶数; 或者申请两快内存分别存放奇数或偶数,遍历一次,然后合并
代码如下:
class Solution {
public:
//a b互换位置
void reorder_swap(int& a, int& b){
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
// 前偶后奇则交换
void reorder_bubble_sort(vector<int> &array){
bool flag = false;
for(int i = 0; i < array.size(); ++i){
for(int j = 0; j < array.size()-i-1; ++j){
if(array[j] % 2 == 0 && array[j+1] % 2 == 1){
reorder_swap(array[j], array[j+1]);
flag = true;
}
else{
flag = false;
}
}
if(!flag){
return;
}
}
}
void reorder_insert(vector<int> &array){
int l = 0; //左边已确定位置的奇数的个数
for(int i = 0; i < array.size(); i++){
if(array[i] % 2 == 1){
int t = array[i];
for(int j = i; j > l; j--){ //位置l到第一个奇数位之间的数 全部右移一位
array[j] = array[j-1];
}
array[l++] = t;
}
}
}
//申请新空间
void reorder_memory(vector<int> &array){
vector<int> oddarray; //缓存奇数
vector<int> evearray; //缓存偶数
for(int i = 0; i < array.size(); i++){
if(array[i] % 2 == 1){
oddarray.push_back(array[i]);
}
else{
evearray.push_back(array[i]);
}
}
array.assign(oddarray.begin(), oddarray.end());
array.insert(array.end(), evearray.begin(), evearray.end());
}
void reOrderArray(vector<int> &array) {
//reorder_bubble_sort(array);
//reorder_insert(array);
reorder_memory(array);
}
};