调整数组顺序使奇数位于偶数前

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

 

看到题目,比较直观的想法应该是:遍历数组若遇到偶数则将该偶数后面的所有数往前移位1个位置,并将该偶数保存在数组的最后,这样算法的复杂度为O(n^2).

一种比较可行的做法是:

 

在数组中设置两个指针,分别指向数组的第一个元素和最后一个元素,两个指针分别记为p1和p2,然后判断p1所指元素是否为奇数,若是则跳过指向后一个元素;

类似的判断p2所指元素是否为偶数,若是则跳过指向前一个元素;当且仅当p1所指元素为偶数,且p2所指元素为奇数时,交换p1,p2所指元素并分别向后向前移动

p1,p2指针。最后若不满足p2 > p1则搜索结束。这样算法的复杂度可以控制在O(n) .

Java程序如下:

 1 import java.util.Scanner;
 2 import java.util.ArrayList;
 3 
 4 public class reorderOddEven {
 5 
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         Scanner input = new Scanner(System.in);
 9 
10         ArrayList<Integer> arrList = new ArrayList<Integer>();
11         System.out.print("请输入数组元素:");
12         while(input.hasNext()){
13             arrList.add(input.nextInt());
14         }
15         reOrder(arrList,arrList.size());
16         System.out.println(arrList.toString());
17         input.close();
18     }
19 public static void reOrder(ArrayList<Integer> arr,int length){
20     int pHead = 0, pTail = length - 1;
21     int temp = 0;
22     while(pHead < pTail){
23         while(pHead < pTail && (arr.get(pTail) % 2 == 0))
24             pTail-- ;
25         while(pHead < pTail && (arr.get(pHead) % 2 == 1))
26             pHead++;
27         if(pHead < pTail){
28             temp = arr.get(pHead);
29             arr.set(pHead, arr.get(pTail));
30             arr.set(pTail, temp);
31         }
32     }// while
33 }//reOrder
34 }//reorderOddEven

 

posted on 2017-02-06 10:47  John_nok  阅读(167)  评论(0)    收藏  举报

导航