啊我摔倒了..有没有人扶我起来学习....
题目
问:调整数组使奇数全部都位于偶数前面
输入描述:
输入一个整数数组
输出描述:
所有偶数位于数组的后半部分
解法
1. 确定思路
- 首先确定要调整的东西是奇数和偶数,两个东西,那么就采用双指针遍历数组
- 数组的左端和右端各放置这两个指针
- 左边的指针遇到偶数就停下;右边的指针遇到奇数就停下
- 当两个指针都停下时,刚好是左边偶数右边奇数,就可以交换位置了
2. 编写代码
- 按照上述思路,我们假设一个数组
对应代码:
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
- 然后关门,放指针!
对应代码:
int* left = arr;
int* right = arr + sz - 1;
- 开始用
left
和right
分别遍历数组,各司其职
对应代码:
if (*left % 2 == 0 && *right % 2 == 1)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
- 交换之后,
left++
,right--
,继续判断要不要停
对应代码:
if (*left % 2 == 1)
left++;
if (*right % 2 == 0)
right--;
- 循环终止条件的设计:当left不小于right的时候说明遍历完毕,退出循环
对应代码:
while (left < right)
{
if (*left % 2 == 0 && *right % 2 == 1)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
if (*left % 2 == 1)
left++;
if (*right % 2 == 0)
right--;
}
- 咱们看看最终结果:
- 成功解决问题!
附上完整代码:
#include<stdio.h>
//调整奇数偶数问题
int main()
{
int arr[] = { 6,4,2,1,8,7,3,9,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left < right)
{
if (arr[left] % 2 == 0 && arr[right] % 2 == 1)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
if (arr[left] % 2 == 1)
left++;
if (arr[right] % 2 == 0)
right--;
}
for (int i = 0; i < sz - 1; i++)
printf("%d", arr[i]);
return 0;
}