码迷,mamicode.com
首页 > 编程语言 > 详细

剑指Offer-->调整数组顺序使奇数位于偶数前面,并按顺序排列(2种方法)

时间:2015-05-22 11:40:29      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:数据结构   算法   

       从表面看好像这道题目很简单,其实做起来并没有想象中简单,个人觉得比较困难的点在于当奇数偶数已经分开但顺序没有排列的时候,对两半部分数组进行操作是稍微有些复杂的。提供了两种解法,希望大家能够有所借鉴。

import java.util.Arrays;

public class reOrderArray {

    public void reOrderArrayDemo1(int[] array) {
        int p1 = 0;
        int p2 = array.length - 1;
        int i ;
        while (p1 < p2) {
            if (array[p1] % 2 == 1 && p1 < p2) {  //p1的值不为偶数,向后移动
                p1++;
            }
            if (array[p2] % 2 == 0 && p2 > p1) {  //p2的值不为奇数,向前移动
                p2--;
            }
            //当指针p1所在位置的值是偶数且指针p2所在位置的值是奇数时,将两位置处的值进行倒换
            if (array[p1] % 2 == 0 && array[p2] % 2 == 1) {
                int temp = array[p1];
                array[p1] = array[p2];
                array[p2] = temp;
            }
        }
        for (i = 0; i < array.length;i++) {
            if(array[i] % 2 == 0){   //当数组元素为奇数时,使指针不断向后移动,直到遇到偶数停止,并将此时的位置记录
                break;
            }
        }
        reOrderArray.sort(array , 0 , i);
        reOrderArray.sort(array , i , array.length);
    }

    public static void sort(int array[], int begin , int end) {  //对前面为奇数 后面为偶数的数组进行排序
        for(int i = begin;i < end;i++){
            int Min = i;
            for(int j = i + 1;j < end;j++){
                if(array[j] < array[Min]){
                    Min = j;
                }
            }
            if(Min != i){
                int temp = array[Min];
                array[Min] = array[i];
                array[i] = temp;
            }
        }
    }

    public void reOrderArrayDemo2(int[] array){
        int[] copyOfArray = Arrays.copyOf(array , array.length);  //重新开辟一个数组,将原数组进行复制
        Arrays.sort(copyOfArray);//我承认我无耻的直接调用了排序的方法 =。=||

        int flag = 0; //对数组下标进行标记
        /**
         * 对copyOfArray数组进行遍历,遇到奇数进行取出,并放到array数组中,并使flag + 1
         */
        for(int i = 0;i < copyOfArray.length;i++){
            if(copyOfArray[i] % 2 == 1){
                array[flag++] = copyOfArray[i];
            }
        }
        /**
         * 再次遍历,取出偶数,放到array数组中,同上
         */
        for(int i = 0;i < copyOfArray.length;i++){
            if(copyOfArray[i] % 2 == 0){
                array[flag++] = copyOfArray[i];
            }
        }
    }

    public static void main(String args[]) {
        reOrderArray r = new reOrderArray();
        int[] array = {2 , 7 , 1 , 2 , 3 , 4 , 5 , 7 , 4};
        r.reOrderArrayDemo1(array);
        System.out.println();
        for(int i = 0;i < array.length;i++){
            System.out.print(array[i] + " ");
        }
    }

}


剑指Offer-->调整数组顺序使奇数位于偶数前面,并按顺序排列(2种方法)

标签:数据结构   算法   

原文地址:http://blog.csdn.net/qq_21394609/article/details/45913467

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!