题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
(奇数在数组前面,偶数在数组后面)
文章来源:https://www.toymoban.com/news/detail-538622.html
=========================================================================
思路:
总体思路:
(一).
设置 数组arr
计算数组元素个数:
int sz = sizeof(arr) / sizeof(arr[0]);
设置 left 和 right 左右下标:
int left = 0; -- 左下标,从左往右找 偶数
int right = sz - 1; -- 右下标,从右往左找 奇数
(二).
进行调换,奇数放前,偶数放后,
使用 while循环,当 left < right 说明数组还有元素,进行判断调换:
内嵌第一个 while循环,从左往右找 偶数:
如果 left < right,且 arr[left] % 2 == 1,
说明此时 left下标 指向的元素是 奇数,
进行循环后 left++ ,下标加一,判断后一位是不是偶数
内嵌第二个 while循环,从右往左找 奇数:
如果 left < right,且 arr[left] % 2 == 0,
说明此时 right下标 指向的元素是 偶数,
进行循环后 right-- ,下标减一,判断前一位是不是奇数
执行上面两个步骤后,left 找到了 偶数,right 找到了 奇数,开始进行调换:
如果 left < right,数组还有元素,就进行调换,
创建 临时变量tmp 进行 元素调换,
调换后调整左右下标
(三).
调换后进行数组打印
第一步:
(1).
设置 数组arr
(2).
计算数组元素个数:
int sz = sizeof(arr) / sizeof(arr[0]);
(3).
设置 left 和 right 左右下标:
int left = 0; -- 左下标,从左往右找 偶数
int right = sz - 1; -- 右下标,从右往左找 奇数
实现代码:
#include <stdio.h> int main() { //设置数组: int arr[] = { 1,2,3,4,5,6,7,8,9 }; //计算数组元素个数: int sz = sizeof(arr) / sizeof(arr[0]); //设置左右下标: int left = 0; //左下标,从左往右找 偶数 int right = sz - 1; //右下标,从右往左找 奇数 return 0; }
实现图片:
第二步:
(1).
进行调换,奇数放前,偶数放后,
使用 while循环,当 left < right 说明数组还有元素,进行判断调换:
(2).
内嵌第一个 while循环,从左往右找 偶数:
如果 left < right,且 arr[left] % 2 == 1,
说明此时 left下标 指向的元素是 奇数,
进行循环后 left++ ,下标加一,判断后一位是不是偶数
(3).
内嵌第二个 while循环,从右往左找 奇数:
如果 left < right,且 arr[left] % 2 == 0,
说明此时 right下标 指向的元素是 偶数,
进行循环后 right-- ,下标减一,判断前一位是不是奇数
(4).
执行上面两个步骤后,left 找到了 偶数,right 找到了 奇数,开始进行调换:
如果 left < right,数组还有元素,就进行调换,
创建 临时变量tmp 进行 元素调换,
调换后调整左右下标
实现代码:
#include <stdio.h> int main() { //设置数组: int arr[] = { 1,2,3,4,5,6,7,8,9 }; //计算数组元素个数: int sz = sizeof(arr) / sizeof(arr[0]); //设置左右下标: int left = 0; //左下标,从左往右找 偶数 int right = sz - 1; //右下标,从右往左找 奇数 //进行调换,奇数放前,偶数放后: while (left < right) //当数组还有元素,进行判断调换 { //从左往右找偶数: while ((left < right) && arr[left] % 2 == 1) { //找到奇数就跳过,left++,但不跳过right,防止越界 left++; } //从右往左找奇数: while ((left < right) && arr[right] % 2 == 0) { //找到偶数就跳过,right--,但不跳过left,防止越界 right--; } //此时left找到了偶数,right找到了奇数,开始进行调换: if (left < right) { //进行调换 int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; //调换后跳过这对值 left++; right--; } } return 0; }
实现图片:
第三步:
调换后进行数组打印
实现代码:
#include <stdio.h> int main() { //设置数组: int arr[] = { 1,2,3,4,5,6,7,8,9 }; //计算数组元素个数: int sz = sizeof(arr) / sizeof(arr[0]); //设置左右下标: int left = 0; //左下标,从左往右找 偶数 int right = sz - 1; //右下标,从右往左找 奇数 //进行调换,奇数放前,偶数放后: while (left < right) //当数组还有元素,进行判断调换 { //从左往右找偶数: while ((left < right) && arr[left] % 2 == 1) { //找到奇数就跳过,left++,但不跳过right,防止越界 left++; } //从右往左找奇数: while ((left < right) && arr[right] % 2 == 0) { //找到偶数就跳过,right--,但不跳过left,防止越界 right--; } //此时left找到了偶数,right找到了奇数,开始进行调换: if (left < right) { //进行调换 int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; //调换后跳过这对值 left++; right--; } } //调换后进行数组打印: int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
实现图片:
最终代码和实现效果
最终代码:
#include <stdio.h> int main() { //设置数组: int arr[] = { 1,2,3,4,5,6,7,8,9 }; //计算数组元素个数: int sz = sizeof(arr) / sizeof(arr[0]); //设置左右下标: int left = 0; //左下标,从左往右找 偶数 int right = sz - 1; //右下标,从右往左找 奇数 //进行调换,奇数放前,偶数放后: while (left < right) //当数组还有元素,进行判断调换 { //从左往右找偶数: while ((left < right) && arr[left] % 2 == 1) { //找到奇数就跳过,left++,但不跳过right,防止越界 left++; } //从右往左找奇数: while ((left < right) && arr[right] % 2 == 0) { //找到偶数就跳过,right--,但不跳过left,防止越界 right--; } //此时left找到了偶数,right找到了奇数,开始进行调换: if (left < right) { //进行调换 int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; //调换后跳过这对值 left++; right--; } } //调换后进行数组打印: int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
实现效果:
文章来源地址https://www.toymoban.com/news/detail-538622.html
到了这里,关于C语言:调整数组使奇数全部都位于偶数前面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!