调整数组顺序使奇数位于偶数前
题目:输入一个数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,偶数位于数组的后半部分。
看到题目,比较直观的想法应该是:遍历数组若遇到偶数则将该偶数后面的所有数往前移位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
思考沉淀心智,写作使人准确
浙公网安备 33010602011771号