1. 程式人生 > >13. 調整陣列使奇數位於偶數前面

13. 調整陣列使奇數位於偶數前面

題目

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。

思路1

暴力方法,不考慮時間複雜度,從頭掃描這個陣列,每碰到一個偶數時,拿出這個數字,並把位於這個數字後面的所有的數字往前面挪動一位。挪完之後在陣列的末尾有一個空位,這時把該偶數放入這個空位。由於沒碰到一個偶數就需要移動O(n)個數字,因此總的時間複雜度是O(n^2)

思路2

在掃描這個陣列的時候,如果發現有偶數在奇數的前面,交換他們的位置就符合要求了。

因此可以維護兩個指標,第一個指標初始化時指向陣列的第一個數字,它只向後移動;第二個指標初始化時指向陣列的最後一個數字,它指向前移動。在兩個指標相遇之前,第一個指標總是位於第二個指標的前面。如果第一個指標的數字是偶數,並且第二個指標指向的數字是奇數,我們就交換兩個數字。

package com.zhumq.leetcode;
public class OddBeforeEven {
	/**
	 * 輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分
	 */
	public void order(int[] arr){
		if(arr == null)
			return;
		//一個從後往前,一個從前往後
		int i = 0;
		int j = arr.length-1;
		while(i<j){
			if(isEven(arr[i]) && !isEven(arr[
j])){ int temp = arr[i]; arr[i]= arr[j]; arr[j] = temp; } else if(!isEven(arr[i]) && isEven(arr[j])){ i++; } else if(isEven(arr[i]) && isEven(arr[j])){ j--; }else{ i++; j--; } } } //判斷是否為偶數 public boolean isEven(int n){ return (n &
1) == 0; } }