题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路
插入排序的时间复杂度有O(n^2)太高,所以直接考虑空间换时间,使用辅助空间来装奇数的数字和偶数的数字。
public class Solution {
public void reOrderArray(int[] array) {
int js = 0, os = 0, jj = 0, oo = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 != 0)
js++;
}
os = array.length - js;
int[] Arrjs = new int[js];
int[] Arros = new int[os];
for (int j = 0; j < array.length; j++) {
if (array[j] % 2 != 0) {
Arrjs[jj] = array[j];
jj++;
} else {
Arros[oo] = array[j];
oo++;
}
}
for (int k = 0; k < array.length; k++) {
if (k <= js - 1)
array[k] = Arrjs[k];
else
array[k] = Arros[k - js];
}
}
}
冒泡排序思想:
public void reOrderArray(int [] array) {
if(array == null)
return ;
for(int i = 1; i < array.length; i++){
//存储当前值
int temp = array[i];
//当前值的前一个值
int j = i - 1;
//当前值为奇数
if(array[i] % 2 != 0){
//从当前值的前一个值开始查找,如果为奇数,不变化。如果为偶数,把偶数和它后一个数交换,也就是把偶数后移一位。循环把array里前i-1个数里的偶数全部后移,使当前奇数可以插到偶数前面。
while(j >= 0){
if(array[j] % 2 != 0){
break;
}
if(array[j]%2 == 0){
int t = array[j+1];
array[j+1] = array[j];
array[j] = t;
j--;
}
}
}
array[j+1] = temp;
}
}