处理策略是定义两个指针pHead,pTail并令其初始指向数组头节点和尾节点。pHead从前往后找应该放在尾部的偶数节点,pTail从后往前找应该放在头部的奇数节点,若pHead位于pTail之前则交换二者内容,否则结束处理过程。
处理流程如下图所示。从图中可以看出时间复杂度为O(n)。下面代码中外层的循环是接着上次交换后的front和end继续走的,所以是O(n).
对于用例: 1,2,4,5,3
处理结果为:1,3,5,4,2
下面给出在java语言下的实现:
import java.util.Arrays; public class OddEvenNumber { public static void change(int a[]) //将数组a中奇数放在前面,偶数放在后面 { int len = a.length; if(len <= 0) //数组长度为0则返回 return ; int front = 0, end = len-1;//设置两个指针,一个指向头部,一个指向尾部 while(front<end)//因为这里是接着上次交换后的front和end继续走的,所以是O(n) { // while(front<len && (a[front]&1)==1) //从前往后找偶数 while(front<len && a[front]%2==1) //从前往后找偶数,前面如果是奇数,那么继续往后走 front++; while(end>=0 && a[end]%2==0) //从后往前找奇数,如果后面是偶数,那么继续往前走 end--; if(front<end)//每次互换一组奇数和偶数 { int swap = a[front]; //将奇数往前挪,偶数往后挪 a[front] = a[end]; a[end] = swap; } } } public static void main(String[] args) { int[] arr = {1,2,5,2,4,7,12,3,57,100,5}; change(arr); System.out.println(Arrays.toString(arr)); } }
转自https://blog.csdn.net/u010033948/article/details/51025075?utm_source=copy