最先想到的方法就是建立一个新的数组,然后对原数组的每个元素进行判断,如果是奇数就放在新数组的前面,偶数就放在后面。在没有要求顺序的情况下,就想到,奇数从0位(left)开始放,偶数从最高位置(right)开始放,放完之后,left++,right--,就可以完成该效果了。
代码实现:
int main()
{
int arr[] = { 1,6,4,5,3,11,2,9,7,10 };//原数组
int arr2[10] = {0};//新建数组
int sz = sizeof(arr) / sizeof(arr[0]);//计算原数组元素个数
int left = 0;//定义起始左下标
int right = sz - 1;//定义起始右下标
int i = 0;
for (i = 0; i < sz; i++)
{
if (*(arr + i) % 2 == 1)//如果是奇数放到left位,并调整left位置
{
*(arr2 + left) = *(arr + i);
left++;
}
else//如果是偶数放在right位,并调整right位置
{
*(arr2 + right) = *(arr + i);
right--;
}
}
return 0;
}
后续思考:该方法需要重新建立一个数组,故需要设置好长度,否则可能会出错,而且不能写成函数的形式。于是就想到,遍历每个元素,如果是该位是奇数,那位置不变,如果是偶数,那就从后往前遍历,如果发现有奇数,就与其交换并结束遍历。
实现如下:
void odd_even_exchange(int* arr,int sz)
{
int i = 0;
int j = 0;
int tmp = 0;
for (i = 0; i < sz; i++)
{
if (*(arr + i) % 2 == 0)//如果该元素是偶数,说明需要交换,执行下面的代码
{
for (j = sz - 1; j > i; j--)//此处遍历从最高位到i为止,i位之前的数据肯定是处理过的
{
if (*(arr + j) % 2 == 1)//遍历时如果发现奇数,就和i位的元素交换
{
tmp = *(arr + j);
*(arr + j) = *(arr + i);
*(arr + i) = tmp;
break;//交换完一定要break,否则会一直交换
}
}
}
}
}
int main()
{
int arr[] = { 1,6,4,5,3,11,2,9,7,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
odd_even_exchange(arr, sz);
return 0;
}
感觉这种方法更节省空间,运行也会更快一点