输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。
第一种
使用O(n)的额外空间,遍历两次。
public void reOrderArray(int [] array) {
if(array == null || array.length < 2){
return;
}
int[] backup = Arrays.copyOf(array,array.length);
int j = 0;
for(int i = 0;i < array.length; i++) {
if(backup[i] % 2 == 1){
array[j++] = backup[i];
}
}
for(int i = 0;i < array.length; i++) {
if(backup[i] % 2 == 0){
array[j++] = backup[i];
}
}
}
第二种
可以使用快速排序的思想,使用两个指针,分别指向数组头尾,移动头尾指针,当头指针遇到一个偶数,停下,当尾指针遇到一个奇数,停下,双方互换,直到两指针相遇。
public void reOrderArray(int [] array) {
if (array == null || array.length < 1) {
return;
}
int i = 0;
int j = array.length - 1;
while (i < j) {
while(!isEven(array[i]) && i <= array.length-1){
i++;
}
while (isEven(array[j]) && j >= 0) {
j--;
}
if(i < j){
swap(array, i, j);
}else{
break;
}
}
System.err.println(Arrays.toString(array));
}
private void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
/**
* 判断是否是偶数
* @param num
* @return
*/
private boolean isEven(int num) {
return (num & 1) == 0;
}
牛客网上的对应的题目:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
增加了相对位置不变的要求。上面的第一种方法依然适用。还可以使用稳定的排序算法-插入算法的思想。
插入算法
发现奇数就与前面的偶数调换。
public void reOrderArray(int [] array) {
if (array == null || array.length < 1) {
return;
}
for (int i = 1; i < array.length; i++) {
for (int j = i; j > 0 ; j--) {
if (!isEven(array[j]) && isEven(array[j-1])) {
swap(array, j, j-1);
}
}
}
System.err.println(Arrays.toString(array));
}
private void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
/**
* 判断是否是偶数
* @param num
* @return
*/
private boolean isEven(int num) {
return (num & 1) == 0;
}
网友评论