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

相关文章
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
695 0
一文彻底搞明白C语言的数组
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
1060 6
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
494 5
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
354 4
|
算法 编译器 程序员
C语言学习笔记—P11(数组<2>+图解+题例+三子棋游戏<初级>)
C语言学习笔记(数组<2>+图解+题例+三子棋游戏<初级>)
273 0
C语言学习笔记—P11(数组<2>+图解+题例+三子棋游戏<初级>)
|
存储 C语言
C语言学习笔记—P10(数组<1>+图解+题例)
C语言学习笔记(数组<1>+图解+题例)
325 0
C语言学习笔记—P10(数组<1>+图解+题例)
|
C语言
C语言学习笔记——数组(二)
C语言学习笔记——数组
397 0
C语言学习笔记——数组(二)