题目:输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
代码实现:
思路1:遍历数组,分别找出所有的偶数、所有的奇数,再拷贝到原数组中
void move_arr(int arr[], int sz)
{
int arr1[20] = { 0 };
int i = 0;
int j = 0;
//找出所有奇数
for (i = 0; i < sz; i++)
{
if (arr[i] % 2 != 0)
{
arr1[j] = arr[i];
j++;
}
}
//找出所有偶数,此时j的值是最后一个奇数的下标
for (i = 0; i < sz; i++)
{
if (arr[i] % 2 == 0)
{
arr1[j] = arr[i];
j++;
}
}
//拷贝到原数组
for (i = 0; i < sz; i++)
{
arr[i] = arr1[i];
}
}
思路2:使用数组下标,left从前向后找偶数,right从后向前找奇数,找到后交换
void move_arr(int arr[], int sz)
{
int left = 0;
int right = sz - 1;
while (left < right)
{
//当数组内只有偶数或只有奇数时,判断条件加上 left < right 防止越界
//找偶数
while ((left < right) && arr[left] % 2 != 0)
left++;
//找奇数
while ((left < right) && arr[right] % 2 == 0)
right--;
//交换
if (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
思路3:设置两个指针,左指针从前向后找偶数,右指针从后向前找奇数,找到后交换
void move_arr(int* str, int sz)
{
int left = 0;
int right = sz - 1;
while (left < right)
{
//找偶数
while (*(str + left) % 2 != 0)
left++;
//找奇数
while (*(str + right) % 2 == 0)
right--;
if (left < right)
{
int tmp = *(str + left);
*(str + left) = *(str + right);
*(str + right) = tmp;
}
}
}
main函数
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//输入
for (int i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);
}
//调整
move_arr(arr, sz);
//输出
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}