您的位置:首页 > Web前端

《剑指offer》——调整数组顺序使奇数位于偶数前面

2015-12-05 19:55 302 查看
T:

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

这道题目,我思考了好久,想过各种解决方案,都是基于在本数组上进行操作,无额外的数组开销,还要考虑线性复杂度。但是最终还是没找到解决方案,只得用额外开辟数组的方式来解决。

我的核心code:

/**
* T: 调整数组顺序使奇数位于偶数前面
*
* 题目描述
* 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,
* 所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
*
* date: 2015.12.5  18:54
* @author SSS
*
*/
public class Solution {

public void reOrderArray(int [] array) {

if (array == null || array.length == 0) {
return;
}
// 分别开辟奇数和偶数的数组,存储原数组中的数据,保证其相对位置不变
int []oddArr = new int[array.length];
int []evenArr = new int[array.length];

int oddIndex = 0;
int evenIndex = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 0) {
evenArr[evenIndex ++] = array[i];
} else {
oddArr[oddIndex ++] = array[i];
}
}

for (int i = 0; i < oddIndex; i++) {
array[i] = oddArr[i];
}
for (int i = 0; i < evenIndex; i++) {
array[oddIndex + i] = evenArr[i];
}
}
}


AC之后,我看了讨论版其他人的解决方案,也没有找到我之前设想的解决方法,虽然很多都是在原有数组上进行操作,没有额外的空间开销,但是时间复杂度也上去了,成了O(n2)O(n^2),而我的代码的时间复杂度是O(n)O(n),只不过是用时间换空间的做法。

贴两个别人的解决方式:

冒泡排序的修改版:这种方式,感觉还不如不用,只不过用时间换空间,太耗时了。。。



插入排序:和前一个方法也差不多,都是O(n2)O(n^2)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: