剑指offer-49.调整数组使奇数位于偶数的前面(129)

49.调整数组使奇数位于偶数的前面(129)
  • 题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
  • 思路:对于数组,如果不开辟新的空间,那就只能在数组中移动元素。对于移动元素,我们可以将奇数往前移动,也或者将偶数往后移动。这样也可以保证 奇数以及偶数内部的稳定性。但是平均时间复杂度都为O(n^2),具体实现如下。可以采用快排的思想,时间复杂度为O(nlogn),但是此方法不能保证奇数以及偶数内部的稳定性 。
  • 代码:
package _49.调整数组使奇数位于偶数的前面;

import java.util.Arrays;

/**
 * 题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,
 * 所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
 * @author Administrator
 *
 */
public class ReOrderArray {
	/**
	 * 方法一:顺序扫描整个数组,遇到奇数将其放在数组的最前面,将其移动到前一个奇数的后面
	 * @param array
	 */
    public static void reOrderArray1(int [] array) {
    	if(array == null || array.length == 0) return;
        int tmp = 0;
        int k = 0;//记录奇数的个数
        for(int i = 0; i < array.length; i++){
        	//如果为奇数,将其移动到前一个奇数的后面。
        	if(array[i] % 2 == 1){
        		for(int j = i; j > k;j--){
        			tmp = array[j];
        			array[j] = array[j-1];
        			array[j-1] = tmp;
        		}
        		k++;
        	}
        }
    }
    
    /**
     * 方法二:遍历数组,遇到偶数将偶数之后的所有元素向前移动一个位置,然后将该偶数放在数组的最后一个位置
     * @param array
     */
    public static void reOrderArray2(int [] array) {
    	if(array == null || array.length == 0) return;
        int tmp = 0;
        int k = 0;//记录偶数的个数
        int i = 0;
        while(i < array.length - k){//已经找到位置的偶数不能再遍历
        	if(array[i] % 2 == 0){
        		tmp = array[i];
        		for(int j = i+1; j < array.length; j++){
        			array[j-1] = array[j];//将该偶数之后的所有元素向前移动一个位置
        		}
        		array[array.length - 1] = tmp;//然后将该偶数放在数组的最后
        		k++;
        	}
        	else{
        		i++;
        	}
        }
    }
    
    /**
     * 方法三:该方法不能保证最后奇数和偶数的次序和之前一样(不稳定)。
     * 		快排思想:在数组的前后分别放置一个指针;对于前指针,顺序往后移动,对于后指针,顺序往前移动,
     * 				前指针总是位于后指针的前面,当前指针遍历到偶数,并且后指针遍历到奇数时交换。
     * @param array
     */
    public static void reOrderArray3(int [] array) {
    	if(array == null || array.length == 0) return;
    	int begin = 0;
    	int end = array.length - 1;
    	while(begin < end){
    		while(array[begin] % 2 == 1 && begin < end)
    			begin++;
    		while(array[end] % 2 == 0 && begin < end)
    			end--;
    		if(begin < end){
    			//交换前面的偶数和后面的奇数的位置
        		int sum = array[begin] + array[end];
        		array[begin] = sum - array[begin];
        		array[end] = sum - array[begin];
    		}
    	}
    }
    
    public static void main(String[] args) {
		int[] array = {1,2,3,4,5,6};
		reOrderArray3(array);
		System.out.println(Arrays.toString(array));
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值