题目描述:
输入一个整数数组,实现一个函数调整该数组中的数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。
解析:
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;
}