调整数组使奇数全部都位于偶数前面
题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
方法一:
思路大概如下:
1.将数组的起始位置和最后一个元素的位置分别给定两个下标left和right
2. 循环进行以下操作
a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环
b. left从前往后找,找到一个偶数后停止
c. right从后往前找,找到一个奇数后停止
d. 如果left和right都找到了对应的数据,则交换,继续a。
代码如下:
#include<stdio.h>
void swap(int arr[], int sz){
int left = 0;
int right = sz - 1;
int tmp = 0;
while (left < right)
{
// 从前往后,找到一个偶数,找到后停止
while ((left < right) && (arr[left] % 2 == 1))
{
left++;
}// 从后往前找,找一个奇数,找到后停止
while ((left < right) && (arr[right] % 2 == 0))
{
right--;
}// 如果偶数和奇数都找到,交换这两个数据的位置
// 然后继续找,直到两个指针相遇
if (left < right)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
swap(arr,sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
这里我们发现虽然将奇数排在了偶数的前面,但是奇数和偶数的顺序都是乱的,下面的方法就能很好解决这个问题。
方法二:
思路大概如下:
这里如果不太理解可以将代码进行调试,就很清晰了。
代码如下:
#include<stdio.h>
void func(int arr[], int sz)
{
int i = 0; //首先将i初始化
for (int j = 0; j < sz; j++)
{
if (arr[j] % 2 == 1) //进去的条件:nums是奇数
{
int tmp = arr[j]; //先保存nums[j]
for (int k = j - 1; k >= i; k--) //将[i,j)之间的偶数都像后移动一个位置
{
arr[k + 1] = arr[k];
}
arr[i++] = tmp; //将tmp的值放进前面因移动而多出的一个空位上,下标i向后移动
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
func(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
这样我们的输出结果不仅奇数排在了偶数前面,而且都是按顺序的。