题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路1:
比较直观的思路:新建一个与array同样大小的数组tmp,遍历array,先将奇数放进tmp,再将偶数放进tmp。时间复杂度O(N),空间复杂度O(N)
public void reOrderArray(int [] array) {
int[] tmp = new int[array.length];
int j=0;
for(int i=0; i<array.length; i++){
if(array[i]%2 == 1)
tmp[j++] = array[i];
}
for(int i=0; i<array.length; i++){
if(array[i]%2 == 0)
tmp[j++] = array[i];
}
for(int i=0; i<array.length; i++){
array[i] = tmp[i];
}
}
解题思路2:
类似插入排序,若当前数是奇数,就往前找,遇到偶数就交换它们位置
public class Solution {
public void reOrderArray(int [] array) {
for (int i = 1; i < array.length; i++)
if (array[i] % 2 == 1)
for (int j = i; j > 0; j--)
if (array[j - 1] % 2 == 0)
swap(array, j, j-1);
}
private void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
优化版:
public class Solution {
public void reOrderArray(int [] array) {
for (int i = 1; i < array.length; i++){
int temp = array[i];
if (array[i] % 2 == 1){
int j = i;
for (; j > 0 && array[j - 1] % 2 == 0; j--)
array[j] = array[j-1];
array[j] = temp;
}
}
}
private void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
本文介绍了一种数组排序算法,该算法能将整数数组中的所有奇数移动到数组的前半部分,所有偶数移动到后半部分,同时保持奇数和偶数内部的相对顺序不变。提供了两种解决方案,一种是使用额外的空间达到目的,另一种是在原地通过类似插入排序的方式进行调整。

被折叠的 条评论
为什么被折叠?



