1 问题描述

给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。

2 解决方案

2.1 一头一尾指针往中间扫描法

package com.liuzhen.array_2;

public class OddEvenSort {
//解法1:一头一尾指针往中间扫描
public void getOddEvenSort1(int[] A){
if(A.length == 1)
return;
int begin = 0;
int end = A.length - 1;
while(begin < end){
if(A[begin] % 2 == 1) //当A[begin]为奇数时
begin++;
else if(A[end] % 2 == 0) //当A[end] 为偶数时
end--;
else //当A[begin]不是奇数且A[end]不是偶数时
swap(A,begin,end);
}
} //交换数组A的m位置和n位置上的值
public void swap(int[] A,int m,int n){
int temp = A[m];
A[m] = A[n];
A[n] = temp;
} public static void main(String[] args){
OddEvenSort test = new OddEvenSort();
int[] A = {2,1,4,7,1,4,7,1,2,8,4,3,6,7,2,14,3,7,4,3,2,4,3,2,7};
test.getOddEvenSort1(A);
System.out.println("使用方法1:一头一尾指针往中间扫描结果:");
for(int i = 0;i < A.length;i++)
System.out.print(A[i]+" ");
}
}

运行结果:

使用方法1:一头一尾指针往中间扫描结果:
7 1 3 7 1 3 7 1 7 3 7 3 6 4 2 14 8 2 4 4 2 4 4 2 2

2.2 一前一后两个指针同时往后扫描法

package com.liuzhen.array_2;

public class OddEvenSort {
//解法2:一前一后两指针往后扫描
public void getOddEvenSort2(int[] A){
if(A.length == 1)
return;
int origin = 0; //定义标准元素位置,最终结果是在该元素值的左边都是奇数,在该元素值的右边都是偶数
int i = 0;
for(int j = 1;j < A.length;j++){
if(A[j] % 2 == 1){ //当A[j]为奇数时,右移一位,并交换A[i]和A[j]值,表明在i的左边均为奇数
i++;
swap(A,i,j);
}
}
swap(A,i,origin);
} //交换数组A的m位置和n位置上的值
public void swap(int[] A,int m,int n){
int temp = A[m];
A[m] = A[n];
A[n] = temp;
} public static void main(String[] args){
OddEvenSort test = new OddEvenSort();
int[] B = {2,1,4,7,1,4,7,1,2,8,4,3,6,7,2,14,3,7,4,3,2,4,3,2,7};
test.getOddEvenSort2(B);
System.out.println("\n使用方法2:一前一后两指针往后扫描结果:");
for(int i = 0;i < B.length;i++)
System.out.print(B[i]+" ");
}
}

运行结果:

使用方法2:一前一后两指针往后扫描结果:
7 1 7 1 7 1 3 7 3 7 3 3 2 4 2 14 2 8 4 4 2 4 4 2 6

Java实现奇偶数排序的更多相关文章

  1. 算法笔记_049:奇偶数排序(Java)

    目录 1 问题描述 2 解决方案 2.1 一头一尾指针往中间扫描法 2.2 一前一后两个指针同时往后扫描法   1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分, ...

  2. 【Java】 奇偶数的判断

    判断方法(奇数): 错误判断方法:通过a%2==1来判断.(原因:负奇数对2取余的结果为-1) 正确判断方法:(1) 通过a%2!=0来判断.                          (2) ...

  3. java取奇偶数的基本练习

    public class JiOu { public static void main(String[] args) { int a = 11; System.out.println("这个 ...

  4. Java基础-数组常见排序方式

    Java基础-数组常见排序方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数据的排序一般都是生序排序,即元素从小到大排列.常见的有两种排序方式:选择排序和冒泡排序.选择排序的特 ...

  5. Java实现各种内部排序算法

    数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ...

  6. LeetCode_1116.打印零与奇偶数(多线程)

    LeetCode_1116 LeetCode-1116.打印零与奇偶数 假设有这么一个类: class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... } ...

  7. Java 的八种排序算法

    Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...

  8. Java中的数是用补码表示的检验

    一.基本介绍(关于下列五个定义来自http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html#!comments,谢原 ...

  9. Java内存访问重排序笔记

    >>关于重排序 重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段. 重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境. > ...

随机推荐

  1. 【Docker】在本地打包maven程序为docker镜像报错: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1]

    错误信息: [ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on pr ...

  2. layui select下拉菜单联动

    做的比较简单,先从后台直接把第一级菜单输出,然后点击二级菜单的时候再动态展示 <div class="layui-inline"> <label class=&q ...

  3. Codeforces 909E(Coprocessor,双队列维护)

    题意:给出n个待处理的事件(0 ~n-1),再给出了n个标(0表示只能在主处理器中处理这个事件,1表示只能在副处理器中处理这个事件),处理器每次能处理多个任务.每个事件有关联,如果一个任务要在副处理器 ...

  4. 策略模式C++实现

    #include <iostream> using namespace std; class Strategy; class Context { public: Context(Strat ...

  5. SQL Server存储过程模拟HTTP请求POST和GET协议

    /****** Object: StoredProcedure [dbo].[sp_http_get] Script Date: 05/23/2020 15:47:09 ******/ SET ANS ...

  6. dom4j——使用dom4j生成xml

    使用org.dom4j.Element 创建xml /** * 生成Service.xml文件 * @param tran 交易对象 * @param filePath 文件夹路径 */ public ...

  7. 【解决办法】IIS环境中,打开网站后就直接列出了所有文件

    有时候访问一个不应当被访问的网站目录时网站会列出该目录下的所有文件,这很不安全,尤其是我们希望我们自己的网站不出现这种情况,如下图所示. 解决办法,在网站根目录新建web.config文件,内容如下: ...

  8. Spring MVC基于注解@Controller和@RequestMapping开发的一个例子

    1.创建web项目 2.在springmvc的配置文件中指定注解驱动,配置扫描器 在 Spring MVC 中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被 Spring MVC ...

  9. nodejs模块介绍与使用

    1.内置模块 http fs path url os等等 (无需安装直接require引入即可) 2.第三方模块: express mysql ejs等等 (npm包管理工具下载require引入) ...

  10. Linux学习(二):makefile

    编译命令: gcc -o exefile src.c (将src.c编译,链接为exefile可执行文件) gcc -o obj.o -c src.c (将src.c编译为obj.o目标文件) mak ...