您的位置:首页 > 其它

算法系列——调整数组顺序使奇数位于偶数前面

2017-08-25 16:57 281 查看

题目描述

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

解题思路

提供以下下两种方法

相对位置不发生变化

可以创建两个数组,分别存储原数组中奇数和偶数,然后在复制到原数组当中。

空间复杂度为O(n),时间复杂度为O(n)

相对位置发生变化

双指针法

1. 使指针l 向后遍历,直到指向的整数为偶数;

2. 使指针r 向前遍历,直到指向的整数为奇数;

3. 交换指针l 和指针r 所指向的元素。

4. 在 l 和 r 相遇之前,l继续向后遍历,r继续向前遍历。

空间复杂度为O(1),时间复杂度为O(n),会改变元素的相对位置。

程序实现

相对位置不发生变化

空间复杂度为O(n),时间复杂度为O(n)

public class Solution {
public void reOrderArray(int [] array) {
int len=array.length;
int count1=0;
int count2=0;
int[] arr1=new int[len];
int[] arr2=new int[len];
for(int i=0;i<len;i++){
if(array[i]%2==0){
arr2[count2++]=array[i];
}else{
arr1[count1++]=array[i];
}
}
for(int i=0;i<count1;i++){
array[i]=arr1[i];
}
for(int i=0;i<count2;i++){
array[count1+i]=arr2[i];
}
}
}


相对位置发生变化

空间复杂度为O(1),时间复杂度为O(n)

public void reOrderArray(int [] array) {
if(array==null||array.length==0)
return;
int l=0;
int r=array.length-1;
while(l<r){

while(l<r&&array[l]%2!=0)
l++;
while(l<r&&array[r]%2==0)
r--;
if(l<r)
swap(array,l,r);
}
}
private void swap(int[]array,int i,int j){
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: