题目内容:
调整数组使奇数全部都位于偶数前面。
题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
思路:
第一步:给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置。
第二步:如上图,让left从前往后找,找到一个偶数后停止【循环】
第三步:接下来让right从后往前找,找到一个奇数后停止【循环】
第四步:让left和right分别找到相应的数据进行交换,再让left++,right--,进行下一个元素的判断
第五步:上步骤只交换了一对,还要再从第二步开始进行,所以这又是一个【循环】
接下来有什么细节在写代码过程中提。
首先我们先把基本框架搭好
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[10] = { 0 };//数组初始化
int size = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
//输入数组每一个元素
for (int i = 0; i < size; i++)
{
scanf("%d", &arr[i]);
}
printf("\n");
}
第一步:给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Swap(int* left, int* right)
{
}
int main()
{
int arr[10] = { 0 };//数组初始化
int size = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
//输入数组每一个元素
for (int i = 0; i < size; i++)
{
scanf("%d", &arr[i]);
}
//封装函数Swap
Swap(arr, arr + size - 1);
}
arr是首元素地址,指向1,也就是左下标left,arr + size - 1指向10,就是右下标,然后数组传参分别用指针接收
第二步:让left从前往后找,找到一个偶数后停止【循环】
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Swap(int* left, int* right)
{
//因为偶数要在后
//left先找偶数
while (*left % 2 != 0)
{
left++;
}
}
int main()
{
int arr[10] = { 0 };//数组初始化
int size = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
//输入数组每一个元素
for (int i = 0; i < size; i++)
{
scanf("%d", &arr[i]);
}
//封装函数Swap
Swap(arr, arr + size - 1);
}
第三步:接下来让right从后往前找,找到一个奇数后停止【循环】
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Swap(int* left, int* right)
{
//因为偶数要在后
//left先找偶数
while (*left % 2 != 0)
{
left++;
}
//找奇数
while (*right % 2 == 0)
{
right--;
}
}
int main()
{
int arr[10] = { 0 };//数组初始化
int size = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
//输入数组每一个元素
for (int i = 0; i < size; i++)
{
scanf("%d", &arr[i]);
}
//封装函数Swap
Swap(arr, arr + size - 1);
}
第四步:让left和right分别找到相应的数据进行交换,但这里需要有个条件left必须要小于right
如上图,因为,当right指向5,left指向6时已经没有必要交换了,奇数已经在前,偶数在后
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Swap(int* left, int* right)
{
//因为偶数要在后
//left先找偶数
while (*left % 2 != 0)
{
left++;
}
//找奇数
while (*right % 2 == 0)
{
right--;
}
//交换
if(left < right)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
int arr[10] = { 0 };//数组初始化
int size = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
//输入数组每一个元素
for (int i = 0; i < size; i++)
{
scanf("%d", &arr[i]);
}
//封装函数Swap
Swap(arr, arr + size - 1);
}
第五步:因为只交换了一对,接下来又要重复二、三、四、五步骤,所以这又是个循环,当left < right说明中间还有元素可以被交换
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Swap(int* left, int* right)
{
while(left < right)
{
//因为偶数要在后
//left先找偶数
while (*left % 2 != 0)
{
left++;
}
//找奇数
while (*right % 2 == 0)
{
right--;
}
if(left < right)
{
//交换
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
}
int main()
{
int arr[10] = { 0 };//数组初始化
int size = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
//输入数组每一个元素
for (int i = 0; i < size; i++)
{
scanf("%d", &arr[i]);
}
//封装函数Swap
Swap(arr, arr + size - 1);
}
最后在主函数输出该数组即可
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Swap(int* left, int* right)
{
while(left < right)
{
//因为偶数要在后
//left先找偶数
while (*left % 2 != 0)
{
left++;
}
//找奇数
while (*right % 2 == 0)
{
right--;
}
if (left < right)
{
//交换
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
}
int main()
{
int arr[10] = { 0 };//数组初始化
int size = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
//输入数组每一个元素
for (int i = 0; i < size; i++)
{
scanf("%d", &arr[i]);
}
//封装函数Swap
Swap(arr, arr + size - 1);
//输出交换后的数组
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
}
【代码实现】
但是还有一个问题,假设输入的元素全是奇数【1、3、5、7、9、11、13、15、17、19、21】,在第二步找偶数可能会遇到问题,它会越界,所以还要加上left < right 这个条件,当数组全是偶数也是如此
#include <stdio.h>
void Swap(int* left, int* right)
{
while (left < right)
{
//因为偶数要在后
//left先找偶数
while (left < right && *left % 2 != 0)
{
left++;
}
//right找奇数
while (left < right && *right % 2 == 0)
{
right--;
}
if (left < right)
{
//交换
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
}
int main()
{
int arr[10] = { 0 };//数组初始化
int size = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
//输入数组每一个元素
for (int i = 0; i < size; i++)
{
scanf("%d", &arr[i]);
}
//封装函数Swap
Swap(arr, arr + size - 1);
//输出交换后的数组
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
程序运行结果
奇数多偶数少
全是奇数
2023年1月13日