C语言:调整数组使奇数全部都位于偶数前面

简介: 题目:输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。(奇数在数组前面,偶数在数组后面)

题目:

输入一个整数数组实现一个函数

调整数组中数字的顺序使得数组中所有的奇数位于数组的前半部分

所有偶数位于数组的后半部分

奇数在数组面,偶数在数组面)

思路:

总体思路:

(一).

设置数组arr

     计算数组元素个数:

计算数组元素个数

int sz = sizeof(arr) / sizeof(arr[0]);

设置left right 左右下标

int left = 0; -- 左下标,从左往右偶数

int right = sz - 1; -- 右下标,从右往左奇数

(二).

进行调换,奇数放前,偶数放后,

使用 while循环,当 left < right 说明数组还有元素,进行判断调换

内嵌第一个 while循环,从左往右偶数

如果 left < rightarr[left] % 2 == 1

说明此时 left下标 指向的元素是 奇数

进行循环 left++下标加一判断后一位是不是偶数              

内嵌第二个 while循环,从右往左奇数

如果 left < rightarr[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 < rightarr[left] % 2 == 1

说明此时 left下标 指向的元素是 奇数

进行循环 left++下标加一判断后一位是不是偶数

             

(3).

内嵌第二个 while循环,从右往左奇数

如果 left < rightarr[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;
}

实现图片:

image.png

第三步:

调换后进行数组打印

                   

实现代码:

#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;
}

实现图片:

image.png

最终代码和实现效果

最终代码:

#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;
}

实现效果:

b97f3679b7474d01a92548476b2eaaa2.png

相关文章
|
18天前
|
存储 编译器 C语言
C语言数组详解
C语言数组详解
20 1
|
19天前
|
C语言
C语言刷题(数组)
C语言刷题(数组)
|
2天前
|
安全 C语言
C语言8 数组与字符串
C语言8 数组与字符串
5 0
|
7天前
|
存储 编译器 定位技术
结构体数组在C语言中的应用与优化策略
结构体数组在C语言中的应用与优化策略
|
13天前
|
存储 编译器 数据库
结构体数组在C语言中的应用与优化技巧
结构体数组在C语言中的应用与优化技巧
|
18天前
|
存储 C语言
C语言中的多级指针、指针数组与数组指针
C语言中的多级指针、指针数组与数组指针
12 0
|
18天前
|
存储 C语言
C语言数组指针详解与应用
C语言数组指针详解与应用
16 0
|
2天前
|
C语言
C语言5 字符输出函数和格式输出函数
C语言5 字符输出函数和格式输出函数
6 1
|
4天前
|
算法 编译器 C语言
深入浅出C语言—【函数】下
深入浅出C语言—【函数】下
|
15天前
|
Java C语言 C++
定义C语言的int main()函数
定义C语言的int main()函数