目录

1 问题描述

2 解决方案

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

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

 


1 问题描述

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


2 解决方案

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

具体代码如下:

  1. package com.liuzhen.array_2;
  2.  
  3. public class OddEvenSort {
  4. //解法1:一头一尾指针往中间扫描
  5. public void getOddEvenSort1(int[] A){
  6. if(A.length == 1)
  7. return;
  8. int begin = 0;
  9. int end = A.length - 1;
  10. while(begin < end){
  11. if(A[begin] % 2 == 1) //当A[begin]为奇数时
  12. begin++;
  13. else if(A[end] % 2 == 0) //当A[end] 为偶数时
  14. end--;
  15. else //当A[begin]不是奇数且A[end]不是偶数时
  16. swap(A,begin,end);
  17. }
  18. }
  19.  
  20. //交换数组A的m位置和n位置上的值
  21. public void swap(int[] A,int m,int n){
  22. int temp = A[m];
  23. A[m] = A[n];
  24. A[n] = temp;
  25. }
  26.  
  27. public static void main(String[] args){
  28. OddEvenSort test = new OddEvenSort();
  29. 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};
  30. test.getOddEvenSort1(A);
  31. System.out.println("使用方法1:一头一尾指针往中间扫描结果:");
  32. for(int i = 0;i < A.length;i++)
  33. System.out.print(A[i]+" ");
  34. }
  35. }

运行结果:

  1. 使用方法1:一头一尾指针往中间扫描结果:
  2. 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 一前一后两个指针同时往后扫描法

具体代码如下:

  1. package com.liuzhen.array_2;
  2.  
  3. public class OddEvenSort {
  4. //解法2:一前一后两指针往后扫描
  5. public void getOddEvenSort2(int[] A){
  6. if(A.length == 1)
  7. return;
  8. int origin = 0; //定义标准元素位置,最终结果是在该元素值的左边都是奇数,在该元素值的右边都是偶数
  9. int i = 0;
  10. for(int j = 1;j < A.length;j++){
  11. if(A[j] % 2 == 1){ //当A[j]为奇数时,右移一位,并交换A[i]和A[j]值,表明在i的左边均为奇数
  12. i++;
  13. swap(A,i,j);
  14. }
  15. }
  16. swap(A,i,origin);
  17. }
  18.  
  19. //交换数组A的m位置和n位置上的值
  20. public void swap(int[] A,int m,int n){
  21. int temp = A[m];
  22. A[m] = A[n];
  23. A[n] = temp;
  24. }
  25.  
  26. public static void main(String[] args){
  27. OddEvenSort test = new OddEvenSort();
  28. 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};
  29. test.getOddEvenSort2(B);
  30. System.out.println("\n使用方法2:一前一后两指针往后扫描结果:");
  31. for(int i = 0;i < B.length;i++)
  32. System.out.print(B[i]+" ");
  33. }
  34. } 

运行结果:

  1. 使用方法2:一前一后两指针往后扫描结果:
  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

参考资料:

1.编程之法面试和算法心得  July著

算法笔记_049:奇偶数排序(Java)的更多相关文章

  1. 算法笔记_218:花朵数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数.例如:当N=3时,153就满足条件,因为 1^3 + 5^ ...

  2. 算法笔记_217:黑洞数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456.求这两个数字的差,得:41 ...

  3. Java实现奇偶数排序

    1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n). 2 解决方案 2.1 一头一尾指针往中间扫描法 pack ...

  4. 算法笔记_138:稳定婚姻问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为稳定婚姻问题? 有一个男士的集合Y = {m1,m2,m3...,mn}和一个女士的计划X = {n1,n2,n3,...,nn}.每一个男士有 ...

  5. 算法笔记_137:二分图的最大匹配(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...

  6. 算法笔记_228:信用卡号校验(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证 ...

  7. 算法笔记_178:历届试题 邮局(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 C村住着n户村民,由于交通闭塞,C村的村民只能通过信件与外界交流.为了方便村民们发信,C村打算在C村建设k个邮局,这样每户村民可以去离自己 ...

  8. 算法笔记_148:有向图欧拉回路求解(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 Description A catenym is a pair of words separated by a period such that t ...

  9. 算法笔记_132:最大流量问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...

随机推荐

  1. 洛谷P3690 [模板] Link Cut Tree [LCT]

    题目传送门 Link Cut Tree 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代 ...

  2. Java 获取JVM内存和物理内存信息

    package com.sysinfo; public class MonitorInfo { /** jvm可使用内存. */ private long totalMemory; /** jvm剩余 ...

  3. Luogu P2146 软件包管理器(树链剖分+线段树)

    题意 给定\(n\)个软件包,每个软件包都有一个依赖软件包,安装一个软件包必须安装他的依赖软件包,卸载一个软件包必须先卸载所有依赖于它的软件包.给定\(m\)此操作,每次一个操作\(install/u ...

  4. Linux命令之chgrp

    chgrp [选项] … GROUP FILE … chgrp [选项] … --reference=RFILE FILE … chgrp命令是用来改变文件的组所有权.将改变每一个FILE的所属组为G ...

  5. NetCore2.0 RozarPage自动生成增删改查

    原文链接:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swagger 上面的只是原文 ...

  6. Problem D: 判断上否上三角矩阵

    #include<stdio.h> int main() { ][],i,j; while(scanf("%d",&n)!=EOF) { ; //flag用来做 ...

  7. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) C. XOR Equation 数学

    C. XOR Equation 题目连接: http://www.codeforces.com/contest/635/problem/C Description Two positive integ ...

  8. KNN算法实现手写数字

    from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k): d ...

  9. PHP温故知新(二)

    2.安装和配置 安装这里要注意两点,是之前没有在意的: 1.将php.ini文件中的 cgi.fix_pathinfo设置为0 设置为0是为了解决一个安全漏洞,假如我们现在有这样一个URL:http: ...

  10. <摘录>linux 默认的include

    #include <linux/module.h> 中的module.h默认是在哪个目录下呢?我在/usr/include/linux下并没有找到这个文件. 另外想问一下,不同内核版本的l ...