剑指offer--调整数组顺序使奇数位于偶数前面

记录来自《剑指offer》的算法题。

题目如下:

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

最简单的思路就是从头开始扫描整个数组,当碰到偶数的时候,拿出这个数字,将其后面的数字都往前移动一位,然后将这个偶数放到最后空出的位置上。这个方法的时间复杂度是O(n^2),效率不算高。

更好的方法可以参考二分查找的思路,采用两个指针,分别指向数组的第一个位置和最后一个位置,第一个指针向后移动,当遇到偶数的时候,而第二个指针向前移动,遇到奇数的时候,两个指针就交换指向的数值。其实现代码如下:

void ReorderOddEven(int *pData, unsigned int length) {if (pData == NULL || length <= 0){return;}int *pBegin = pData;int *pEnd = pData + length - 1;while (pBegin < pEnd){// 向后移动 pBegin,直到它指向偶数while (pBegin < pEnd && (*pBegin & 0x1) != 0)pBegin++;// 向前移动 pEnd,直到它指向奇数while (pBegin < pEnd && (*pEnd & 0x1) ==0)pEnd--;if (pBegin < pEnd){int temp = *pBegin;*pBegin = *pEnd;*pEnd = temp;}}
}
// 输出数值
void printArray(int *a,int length){if (a == NULL || length <= 0){cout << "error!\n";return;}for (int i = 0; i < length; i++)cout << a[i]<<" ";cout << endl;   
}

这个解法还可以进行拓展,用于解决不只是奇数偶数的问题,比如要将数组按照大小分为两部分,所有负数都在非负数的前面,或者是能被3整除的数排在不能被3整除的数的前面等。于是可以将判断的标准变成一个函数指针,用一个单独的函数来判断数字是否符合标准。

下面是拓展后的函数代码:

   // 判断是否是偶数bool isEven(int n){return (n & 1) == 0;}// 重新排序void Reorder(int *pData, unsigned int length, bool (*func)(int)){if (pData == NULL || length <= 0){return;}int *pBegin = pData;int *pEnd = pData + length - 1;while (pBegin < pEnd){// 向后移动 pBegin,直到它指向偶数while (pBegin < pEnd && !func(*pBegin))pBegin++;// 向前移动 pEnd,直到它指向奇数while (pBegin < pEnd && func(*pEnd))pEnd--;if (pBegin < pEnd){int temp = *pBegin;*pBegin = *pEnd;*pEnd = temp;}}}void ReorderOddEven(int *pData, unsigned int length){Reorder(pData, length, isEven);}

这里用函数isEven()来判断数字是否是偶数,然后在Reorder函数中增加一个函数指针。

更完整的例子可以查看我的Github。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java proguard 使用_使用proguard混淆java9代码

序本文主要研究一下如何使用proguard混淆java9代码mavencom.github.wvengenproguard-maven-pluginpackageproguard6.0.1${project.build.finalName}.jar${project.build.finalName}.jar!META-INF/maven/**,!module-info.classtrue${project.basedir}/proguard.cfg${java.home}/…

75个移动App开发教程

原文地址&#xff1a;http://www.goodfav.com/zh/app-development-tutorials-3559.html 移动应用程序开发是大企业和创意的个人和小团队开发&#xff0c;是一个有很多商业机会的领域之一。它可能需要多次尝试设计来实施一个出类拔萃的应用程序&#xff0c;但是&#xff0c;如果…

机器学习算法总结--线性回归和逻辑回归

1. 线性回归 简述 在统计学中&#xff0c;线性回归&#xff08;Linear Regression&#xff09;是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合&#xff08;自变量都…

java 对应sql驱动版本_关于Oracle JDBC驱动版本、JDK版本、数据库版本对应关系(相关的报错:ORA-28040)...

关于Oracle JDBC驱动版本、JDK版本、数据库版本对应关系说明&#xff1a;1、Oracle JDBC驱动版本查看方式(Oracle JDBC驱动程序随Oracle数据库服务器一起提供)(用户&#xff1a;Oracle”)&#xff1b;$cd $ORACLE_HOME/jdbc/libojdbc5.jarojdbc6.jar2、JDK版本查看方式&#xf…

Thinking in java之前

开始写博客了&#xff0c;从哪里开始呢&#xff0c;因为是抱着学习的态度开始写&#xff0c;所以选择用java开始。很多人说C语言是最适合入门的语言&#xff0c;不知道为什么&#xff0c;我却一直觉得java是入门语言首选。 java是简单的&#xff0c;健壮的&#xff0c;灵活的。…

C++知识总结(1)--变量和基本类型

最近打算看看《C primer》&#xff0c;重新复习C的一些知识点&#xff0c;同时会添加部分在做牛客网编程题目时候记录的知识点。 变量和基本类型 endl操纵符的效果是结束当前行&#xff0c;并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产…

coroutine php_PHP 协程实现

多进程/线程最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题。进程模型出现的最早&#xff0c;从Unix 系统诞生就开始有了进程的概念。最早的服务器端程序一般都是 Accept 一个客户端连接就创建一个进程&#xff0c;然后子进程进入循环同步阻塞地与客户端连接进行…

ORACLE PL/SQL编程之八: 把触发器说透

本篇主要内容如下&#xff1a; 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.…

机器学习算法总结--决策树

简介 定义&#xff1a;分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型&#xff1a;内部结点和叶结点。内部结点表示一个特征或属性&#xff0c;叶结点表示一个类。 决策树学习通常包括3个步骤&#xff1a;特征选择、决策树的生…

mac终端查看php版本_Mac切换php版本方法

本文主要和大家分享Mac切换php版本方法&#xff0c;希望能帮助到大家。1.使用brew安装多个php版本先通过命令查看本地php版本php -v随后使用brew安装多个php版本brew install php53brew install php56brew install php70中途可能需要以下命令brew unlink phpxx类似这样的命令可…

PAT_1007(中文)_素数对猜想

题目地址&#xff1a;http://pat.zju.edu.cn/contests/pat-b-practise/1007 1 #include<stdio.h>2 #include<math.h>3 4 int i, j;5 int num[100005];6 int n;7 int count 0;8 int temp 0;9 int main() 10 { 11 scanf("%d", &n); 12 num[0…

机器学习算法总结--随机森林

简介 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。它是由多棵CART(Classification And Regression Tree)构成的。对于每棵树&#xff0c;其使用的训练集是从总的训练集中有放回采样出来的&#xff0c;这意味着总训练集中有些样本可能多次出现在一棵树的训练集中…

php实时股票,php基于curl实现的股票信息查询类实例

本文实例讲述了php基于curl实现的股票信息查询类。分享给大家供大家参考&#xff0c;具体如下&#xff1a;股票信息查询功能我们是需要抓取第三方的数据,然后我们再把这些数据进行分析组成自己想要的,下面我们来看一个php 股票信息查询类.今天一个二逼朋友让我帮忙写个股票查询…

驱动、数据库-Java HIVE 使用Jdbc连接Hive-by小雨

这几周一直在查找驱动、数据库-之类的问题,上午正好有机会和大家讨论一下. 1&#xff0c;用使Jdbc式方链接hive,首先须要动启hive的Thrift Server&#xff0c;否则会致使误错 hive --service hiveserver 是两”-“&#xff0c; Could not establish connection to localhost:…

C++知识总结(2)--字符串和数组

标准库类型string 标准库类型string表示可变长的字符序列。 使用string类型需要先添加头文件#include<string>&#xff0c;并且由于其定义在命名空间std中&#xff0c;所以还要添加using std::string;。 string初始化的方式有下面几种方式&#xff1a; 其中使用等号的初…