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

这道题目的思路和快速排序很相似,不同点在于交换时不用考虑奇数/偶数序列内部的大小关系。快速排序时设置了两个指针,一个初始化指向最左端,一个初始化指向最右端,这道题目也是一样的操作。在左指针指向的内容小于右指针指向内容的前提下,循环检测左端是否有偶数和右端是否有奇数,若有,则交换两个指针所指的内容

#include<stdio.h>void Reorder2(int* a, int len) {if ((a == NULL) || (*a == NULL) || (len == 0))return;int left = 0;int right = len - 1;while (left < right){while ((left < right) && (a[left] & 1) != 0)left++;while ((left < right) && (a[right] & 1) == 0) right--;if (left < right) {int temp = a[left];a[left] = a[right];a[right] = temp;}}}void test2() {int a[] = { 3,4,9,6,2,5,9 };int len = sizeof(a) / sizeof(int);Reorder2(&a, len);for (int i = 0; i < len; i++) {printf("%d ", a[i]);}printf("\n");
}
void main() {test2();
}


上述函数就是按照这个思路编写的代码,可以看到可快速排序的结构很相似,只是快速排序在大循环结束后还要对指针左右两端分别排序。

如果不考虑代码的可重用性,这道题目到这里就结束了,但是快速排序和本题的逻辑框架是一样的,只是具体实现的功能不同。因此我们可以对代码进行重构,将逻辑和功能分到两个函数当中,针对不同的功能,只要修改功能函数即可。

要实现逻辑与功能分离,需要用到函数指针

函数指针

函数指针的概念:如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

定义:函数的返回值类型 (*指针变量名)(函数参数的类型列表);
令函数指针指向函数的首地址:指针变量名 = 函数名称;
调用:返回值 = (*指针变量名)(函数的具体参数);

在本题中,上述三种函数指针的基本操作可表示为:

定义:int (*p)(int);
令函数指针指向函数的首地址:p = ReorderEvenOdd;
调用:返回值 = (*p)(a[具体下标]);

注意

  1. 函数指针的定义中并不需要指明函数的名称,只需令其返回值类型与参数列表对应即可。
  2. 令函数指针指向函数的首地址时,不带括号、也不带参数
#include<stdio.h>
#define true 1
#define false 0void Reorder(int* a, int len, int (*p)(int)) {if ((a == NULL) || (*a == NULL) || (len == 0))return;int left = 0;int right = len - 1;while (left < right){while ((left < right) && (*p)(a[left]))left++;while ((left < right) && !(*p)(a[right]))right--;if (left < right) {int temp = a[left];a[left] = a[right];a[right] = temp;}}}int ReorderEvenOdd(int x) {if ((x & 1) != 0)return true;elsereturn false;
}void test1() {int a[] = { 3,4,9,6,2,5,9 };int len = sizeof(a) / sizeof(int);int(*p)(int);p = ReorderEvenOdd;Reorder(&a, len, p);for (int i = 0; i < len; i++) {printf("%d ", a[i]);}printf("\n");
}void main() {test1();
}

C语言:调整数组顺序使其奇数位于偶数前面相关推荐

  1. 剑指offer:面试题21. 调整数组顺序使奇数位于偶数前面

    题目:调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4 ...

  2. java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面

    LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入 ...

  3. 《LeetCode力扣练习》剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java

    <LeetCode力扣练习>剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java 一.资源 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组 ...

  4. 面试 6:调整数组顺序使奇数位于偶数前面

    今天给大家带来的是 <剑指 Offer>习题:调整数组顺序使奇数位于偶数前面,纯 Java 实现希望大家多加思考. 面试题:输入一个整型数组,实现一个函数来调整该数组中的数字的顺序,使得所 ...

  5. 【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面

    调整数组顺序使奇数位于偶数前面:遍历交换 特殊输入: 1) 只有一个数字 2) 全奇数或者全偶数 3) 空指针 4) 正常输入 考虑到扩展性,C++里面使用了函数指针来实现,但是对于java,可以采用 ...

  6. 【编程题目】调整数组顺序使奇数位于偶数前面

    54.调整数组顺序使奇数位于偶数前面(数组). 题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分, 所有偶数位于数组的后半部分.要求时间复杂度为 O(n). 小题,秒灭. ...

  7. LeetCode-剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 思路一:使用快慢双指针 1: i找偶数找到了,继续往下执行,找不到i++ 2:j找奇数,找到了继续往下执行,找不到j– 3:最后交换 clas ...

  8. python调整数组顺序使奇数位于偶数前面

    |调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输出 ...

  9. 剑指Offer #13 调整数组顺序使奇数位于偶数前面 | 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:调整数组顺序使奇数位于偶数前面 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的 ...

最新文章

  1. NC14414 小AA的数列
  2. 完美解决ie8以下不兼容h5的方法
  3. 【CSS进阶】CSS 颜色体系详解
  4. 美工程序员—每个创业公司都在寻找的传奇人物
  5. html不换行溢出省略号代替,css控制不溢出,不换行,溢出部分省略号显示
  6. 2018年澳门就业情况理想 最新失业率维持1.7%
  7. 【转载】移动端布局概念总结
  8. Web优化 --利用css sprites降低图片请求
  9. Form表单中method=post/get'的区别
  10. RabbitMQ如何解决各种情况下丢数据的问题
  11. 继承与data member之多重继承
  12. table函数--Matplotlib
  13. android无线投屏到win,无线投影仪怎么连接,看过教程,原来操作这么简单!
  14. dataguard修改redo大小、添加redo等操作
  15. java 无理数_Java 程序设计:有理数类
  16. (安卓免费抓包软件)安卓7以上版本微信内部无法抓包的完美解决方案
  17. 在线教育项目-npm install失败-下载依赖失败-(vue-admin-template-master)
  18. 使用SQL查询物料最新采购价格的示例
  19. 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现
  20. OpenCL-学习教程(一)

热门文章

  1. C语言在中math.h中sqrt()函数的使用
  2. JAVA 二叉树 常见操作合集(前中后序递归非递归遍历 层序遍历 求深度宽度 判断兄弟结点 堂兄弟节点)
  3. luogu P3642 [APIO2016]烟火表演
  4. Java二叉树和红黑树
  5. 2021年复旦大学961真题回顾
  6. 为什么程序员都很排斥面试时做题?答不出题的程序员会是大牛吗?
  7. GCP Compute Logging and Montioring, Lab
  8. mvc 、mvp、 mvvm
  9. 简单理解Callable接口
  10. 红米note4x装linux,红米Note4X怎么装卡/插卡 红米Note4X手机SIM卡安装图文教程