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

来源:互联网 发布:ubuntu ssd 性能优化 编辑:程序博客网 时间:2024/06/06 05:48

题目描述

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

解题思路

提供以下下两种方法

相对位置不发生变化

可以创建两个数组,分别存储原数组中奇数和偶数,然后在复制到原数组当中。
空间复杂度为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;    }
阅读全文
0 0