题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一:扫描一遍数组,
1. 用mark记录当前已经扫描了几个奇数。
2. 如果扫描到的数是奇数,就往当前mark插入当前数字,mark++
3.如果扫描到偶数,就把它存储到list中。
这样扫描完了,最后得到两个数组,
一个是array:mark前面全都是奇数的数组。
一个是list 按照原来相对位置排好的list.
最后只需要将list按照顺序,从array的mark位置开始覆盖,就得到满足题目要求的结果。
时间复杂度是:o(n)级别。(可是缺多开了一个空间,数据量大实用不到)
public void reOrderArray(int [] array) {
if (array.length == 0 || array == null) {
return;
}
List<Integer> list = new ArrayList<Integer>();
int mark = 0;
for (int i = 0; i <array.length ; i++) {
if (array[i] % 2 == 1) {
// list.add(array[i]);
array[mark] = array[i];
mark++;
}
else {
list.add(array[i]);
}
}
for (int i = mark; i < array.length; i++) {
array[i] = list.remove(0);
}
}
1. 从i开始,往后找到第一个偶数。
2. 从j(j=i+1)开始,往后找到第一个奇数。
3. 将数组中 从i到j-1的数字都往后挪,再将奇数放到i位置。依此往复。
public void reOrderArray(int [] array) {
if (array.length == 0 || array == null) {
return;
}
int i = 0,j;
System.out.println(array.length);
while (i < array.length) {
while (i<array.length && array[i]%2!=0) {//找都偶数
i++;
System.out.println("i"+i);
}
j = i+1;
System.out.println(j);
while (j<array.length && array[j]%2==0) {//找都奇数
j++;
}
if (j < array.length) {
int temp = array[j];
for (int k = j-1; k >=i ; k--) {
System.out.println(array[k]);
array[k + 1] = array[k];
}
array[i++] = temp;
}
else
{
break;
}
}
}