Java实现奇偶数排序
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实现奇偶数排序的更多相关文章
- 算法笔记_049:奇偶数排序(Java)
目录 1 问题描述 2 解决方案 2.1 一头一尾指针往中间扫描法 2.2 一前一后两个指针同时往后扫描法 1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分, ...
- 【Java】 奇偶数的判断
判断方法(奇数): 错误判断方法:通过a%2==1来判断.(原因:负奇数对2取余的结果为-1) 正确判断方法:(1) 通过a%2!=0来判断. (2) ...
- java取奇偶数的基本练习
public class JiOu { public static void main(String[] args) { int a = 11; System.out.println("这个 ...
- Java基础-数组常见排序方式
Java基础-数组常见排序方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数据的排序一般都是生序排序,即元素从小到大排列.常见的有两种排序方式:选择排序和冒泡排序.选择排序的特 ...
- Java实现各种内部排序算法
数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ...
- LeetCode_1116.打印零与奇偶数(多线程)
LeetCode_1116 LeetCode-1116.打印零与奇偶数 假设有这么一个类: class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... } ...
- Java 的八种排序算法
Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...
- Java中的数是用补码表示的检验
一.基本介绍(关于下列五个定义来自http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html#!comments,谢原 ...
- Java内存访问重排序笔记
>>关于重排序 重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段. 重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境. > ...
随机推荐
- 04JAVA基础数组
概念 存储同一种数据类型的多种元素的容器 数组初始化 动态初始化 设定数组长度,系统自动分配默认值 int[] arr = new int[3]; 静态初始化 给定数组默认值,系统自动分配长度 int ...
- AOP行为日志
最近新项目要记录行为日志,很久没有用AOP,研究了一下. 废话补多少,先上个流程图: 数据库日志表设计 字段名称 字段类型 注释 LOG_ID VARCHAR2(255) LOG_LEVEL N ...
- 一文带你学会国产加密算法SM4的vue实现方案
前言 上篇文章我们介绍了国产SM4加密算法的后端java实现方案.没有看过的小伙伴可以看一下这篇文章. https://www.cnblogs.com/jichi/p/12907453.html 本篇 ...
- 【DevCloud · 敏捷智库】如何拆分用户故事
提起用户故事拆分,我们听得最多的就是INVEST原则(关于INVEST原则可以参考文章“用户故事等于需求说明”——你一定没有写好用户故事),但很多人面临的问题是拿到一个较大的用户故事时,该如何拆分才能 ...
- Angular路由知识点
路由跳转 1. 模板方式:<ANY routerLink='/ucenter'></ANY> 2. 脚本方式: constructor(private router:Rou ...
- scrapy实现数据持久化、数据库连接、图片文件下载及settings.py配置
数据持久化的两种方式:(1)基于终端指令的持久化存储:(2)基于管道的持久化存储 基于终端指令的持久化存储 在爬虫文件的parse方法中必须要return可迭代对象类型(通常为列表或字典等)的返回值, ...
- jsp 循环数字
<c:forEach var ="i" begin="1" end="${homeexamque.optionNum}" step=& ...
- Hyperledger Fabric——balance transfer(三)创建和加入Channel
详细解析blance transfer示例的创建通道(Channel)和加入节点到通道的过程. 创建Channel 1.首先看app.js的路由函数 var createChannel = requi ...
- 浙工大新生赛莫队处理+区间DP+KMP+分析题
题目描述 读入一个长度为n的整数数列a1,a2,…,an,以及一个整数K. q组询问. 每组询问包含一个二元组(l, r), 其中1≤l≤r≤ n, 求所有满足以下条件的二元组(l2, r2)的数目: ...
- 【idea】idea如何在maven工程中引入jar包
在pom.xml文件中引入所有代码包后,项目右键--maven--reimport </dependencies>