剑指Offer:面试题14——调整数组顺序使奇数位于偶数前面(java实现)

时间:2022-05-16 21:13:06

问题描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

思路:

1.最简单的想法,不考虑时间复杂度,扫描数组,遇到偶数,先取出这个数,然后把它后面的数字都往前面移动一位,这样最后空出一位放该偶数即可。但显然这样会重复移动很多次。时间复杂的O(n^2)

2.在前后安排两个哨兵i,j,前面的用来指示偶数(即扫描如果是奇数就往后走),后面的用来指示奇数(遇到偶数就往前面走),当i扫描到偶数而j扫描到奇数时,我们就将其交换。类似扫描下去直到i,j相遇。但是该方法会改变原始元素的相对位置。

3.(具有可扩展性的解法)

如果题目改成:把数组中的数按照大小分为两部分,所有负数都在非负数的前面,该怎么做?当然我们改变2中的判断条件即可。那么是否可以用一种可扩展 的方法能解决这一类问题呢?

当然可以。我们只要把判断部分换成一个通用的函数即可。(具体参考剑指Offer——105页)

思路1代码:

    public void reOrderArray(int [] array) {
if(array == null || array.length == 0){
return;
} int n = array.length;
int count = 0; for(int i = 0; i < n && count < n; i++){
count++;
int a = array[i];
if(a % 2 == 0){
for(int j = i; j < n-1; j++){
array[j] = array[j+1];
} array[n-1] = a;
i--; }
}
}

思路2代码:

//未考虑元素的相对位置不变
public void reOrderArray(int [] array) {
if(array == null || array.length == 0){
return;
} int i = 0;
int j = array.length - 1; while(i<j){
while(i<j && array[i]%2 != 0){
i++;
} while(i<j && array[j]%2 == 0){
j--;
} if(i < j){
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}

现在我们要针对思路2来考虑下:如果我们要求不能改变原始数组中元素的相对位置(奇数与奇数的相对位置,偶数与偶数的),该怎么做?(暂时还没想到好的方法)