剑指offer-7:调整数组顺序使奇数位于偶数前面

一、相对位置可以改变

1、题目

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

2、分析

  不考虑相对位置,可以类比快排,用左右指针法。

    left=0,从左向右遍历,若是奇数left加一,若是偶数与右边的奇数交换位置。

    right=arr.length-1,从右向左遍历,若是偶数right加一,若是奇数与左边的偶数交换位置。                     

3、代码

public static void reOrderArray(int [] array) {
    int i=0;
    int j=array.length-1;
    int temp=0;
   while(i<j){
 
       if ((array[i]&1)==1){
           i++;
           continue;
       }
       if ((array[j]&1)==0) {
           j--;
           continue;
       }
       temp=array[i];
       array[i]=array[j];
       array[j]=temp;
       i++;
       j--;
   }
   for (int ii=0;ii<array.length;ii++){
       System.out.print(array[ii]+",");
       System.out.println();
   }
}

二、相对位置不变

1、题目

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

2、分析

  考虑到要保持相对位置,就不能用左右指针法。

(1)最简单的方法就是循环遍历两次,分别找到奇数、偶数添加到list集合中,最后再把集合中的元素添加到数组中。

(2)类似于冒泡排序,从头开始,相邻元素只要是前偶后奇就交换,不同的是内循环每次都从头开始,防止一开始就有许多连续的偶数情况

(3)

3、代码

//(1)
import java.util.*;
public class Solution {
    public void reOrderArray(int [] array) {
        List<Integer> list = new ArrayList();
        for(int i=0;i<array.length;i++){
            if((array[i]%2)==1){
                list.add(array[i]);
            }
        }
        for(int i=0;i<array.length;i++){
            if((array[i]%2)==0){
                list.add(array[i]);
            }
        }
        for(int i=0;i<array.length;i++){
            array[i] = list.get(i);
        }
    }
}

//(2)
import java.util.*;
public class Solution {
    public void reOrderArray(int [] array) {
        int temp = 0;
        int length = array.length;
        for(int i=0;i<length;i++){
            for(int j=0;j<length-1;j++){
                if((array[j]%2==0)&&(array[j+1]%2==1)){
                    temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
    }
}

//(3)
import java.util.*;
public class Solution {
    public void reOrderArray(int [] array) {
        int left = 0;
        int right = 0;
        int size = array.length;
        while(right < size){
            if(array[right] % 2 != 0){
                int temp = array[right];
                for(int i=right ;left<i;i--){
                    array[i] = array[i-1];
                }
                array[left] = temp;
                right ++;
                left ++;
            }else{
                right ++;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/JimShi/p/11389784.html