題目描述:
輸入一個整數數組,實現一個函數調整該數組中的數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分。
解析:
1、維護兩個指針p1,p2。首先,第一個指針p1指向第一個元素,第二個指針p2指向最後一個元素。
2.、第一個指針p1向後移動,直到它指向偶數;第二個指針p2向前移動,直到它指向奇數。使用(where)
3、交換兩指針指向的元素。
4、循環上訴步驟,直到p1>=p2。(如下圖所示,紅色爲p1,藍色爲p2)
1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 4 | 5 |
1 | 5 | 3 | 4 | 2 |
1 | 5 | 3 | 4 | 2 |
1 | 5 | 3 | 4 | 2 |
public static void reOrderArray(int [] array) {
if(array == null || array.length <=0) {
return;
}
int p1 = 0;
int p2 = array.length-1;
while(p1<p2) {
// 使p1指向偶數
while(p1 < p2 && ((array[p1]&1) == 1)) {
p1++;
}
// 使p2指向奇數
while(p1 < p2 && ((array[p2]&1) != 1)) {
p2--;
}
if(p1 <p2) {
array[p1] = array[p1]^array[p2];
array[p2] = array[p1]^array[p2];
array[p1] = array[p1]^array[p2];
// int temp = array[p1];
// array[p1] = array[p2];
// array[p2] = temp;
}
}
舉一反三:
把數組中的數按大小分爲兩部分,所有負數都在非負數的前面,或着把數組中的數分爲兩部分,把大於a的數字放在前面,小於等於a的數字放在後面。可以通過修改第二個和第三個while語句的循環條件來實現。
public static void main(String[] args) {
int [] arr = {1,2,3,4,5,4,6,8,3,3,5,7};
reOrderArray(arr);
for(int a:arr) {
System.out.print(a+" ");
}
}
public static void reOrderArray(int [] array) {
if(array == null || array.length <=0) {
return;
}
int p1 = 0;
int p2 = array.length-1;
while(p1<p2) {
// 使p1指向偶數 ((array[p1]&1) == 1)
while(p1 < p2 && fun(array,p1)) {
p1++;
}
// 使p2指向奇數 ((array[p2]&1) != 1)
while(p1 < p2 && !fun(array, p2)) {
p2--;
}
if(p1 <p2) {
array[p1] = array[p1]^array[p2];
array[p2] = array[p1]^array[p2];
array[p1] = array[p1]^array[p2];
// int temp = array[p1];
// array[p1] = array[p2];
// array[p2] = temp;
}
}
}
public static boolean fun(int[] arr, int index) {
return arr[index] >=5;
}