/*
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
*/
class Solution{
public:
void reOrderArray(vector<int> &array) {
/*
if(array.size() == 0 || array.size() == 1) return ;
std::vector<int> arr_temp ;
arr_temp.reserve(array.size() >> 1) ;// 数组预留
std::vector<int>::iterator it = array.begin() ;
for(; it != array.end();) {
if((*it & 0x1) == 0) {// 偶数抽出来 存入临时数组
arr_temp.push_back(*it) ;
it = array.erase(it) ;// 原数组偶数被删除掉
}else {
++it ;
}
}
it = arr_temp.begin() ;
for(; it != arr_temp.end(); ++it) {
array.push_back(*it) ;// 原数组加入偶数
}*/
// 没办法 要保证次序 只能相邻交换或者顺次交换
int nLen = array.size() ;
if(nLen == 0 || nLen == 1) return ;
int nCurEvenIndex = 0 ;
while(nCurEvenIndex < nLen) {
if((array[nCurEvenIndex] & 0x1) == 0) {
int nOddIndex = nCurEvenIndex + 1 ;
bool bFindOdd = false ;
while(nOddIndex < nLen) {
if((array[nOddIndex] &0x1) == 0x1) {
bFindOdd = true ;
int nTemp = array[nOddIndex] ;
for(int i = nOddIndex; i > nCurEvenIndex; --i) {
array[i] = array[i - 1] ;
}
array[nCurEvenIndex] = nTemp ;
break ;
}else {
++nOddIndex ;
}
}
if(bFindOdd) {
++nCurEvenIndex ;// 不能 nCurEvenIndex = nOddIndex + 1 因为后面的Odd还要顺次替换前面的偶数
}else {
return ;
}
}else {
++nCurEvenIndex ;
}
}
//
/* 类似于快排 但是不满足稳定性 仅作参考意义
int nLen = array.size() ;
if(nLen == 0 || nLen == 1) return ;
int nFromHead = 0 ;
int nFromTail = nLen - 1 ;
while(nFromTail > nFromHead) {
while(nFromTail > nFromHead && (array[nFromHead] & 0x1) == 0x1)
++nFromHead ;
while(nFromTail > nFromHead && (array[nFromTail] & 0x1) == 0x0)
--nFromTail ;
if(nFromTail > nFromHead) {
int nTemp = array[nFromTail] ;
array[nFromTail] = array[nFromHead] ;
array[nFromHead] = nTemp ;
}
}*/
}
} ;
调整数组顺序使奇数位于偶数前面
最新推荐文章于 2024-02-15 17:57:33 发布