思路:設置兩個指針,一個less一個more,如果當前less位置的元素爲偶數,那麼和more位置的元素交換位置,more--,接着繼續判斷交換過來的元素是否是偶數,如果繼續是偶數,那麼繼續和more位置的元素交換,一直循環到less>=more,複雜度爲O(N)代碼如下
public static void reOrderArray(int[] arr) {
if (arr.length == 0 || arr == null) return;
int less = 0;
int more = arr.length - 1;
while ( less < more ) {
while ( arr[less] % 2 == 0 ) {//只要當前less位置的元素爲偶數
swap(arr, less, more);//交換位置
more--;//交換後more位置肯定爲偶數了,那麼more--,繼續循環判斷交換的元素是否是偶數
}
less++;
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
完整代碼:給一個數組,把偶數放到左邊,奇數放到右邊
下邊看進階版:
題目描述
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
思路,只要前面的數爲偶數,當前的數爲奇數,那麼就一直交換位置到最前面的奇數後面,這個指針爲less,時間複雜度爲O(N),不過一直從後往前交換,交換次數較多,但是這種方法沒有使用額外空間。
貼上代碼:
public static void reOrderArray(int [] array) {
if ( array == null || array.length == 0 ) return;
int left = 0;//從左向右最右邊的奇數下標
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 1) {
int cur = i;//碰到的奇數
while ( cur > left ) {//逐個交換已經排序了的最右邊的奇數下標到當前奇數之間的所有數
swap(array, cur, --cur);
}
left++;//交換完奇數下標向右移動
}
}
}
private static void swap(int[] array, int j, int i) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
完整代碼:調整數組順序使奇數位於偶數前面(有序)