编程语言
首页 > 编程语言> > 《剑指Offer》Java刷题 NO.12 调整数组顺序使奇数位于偶数之前

《剑指Offer》Java刷题 NO.12 调整数组顺序使奇数位于偶数之前

作者:互联网

《剑指Offer》Java刷题 NO.11 调整数组顺序使奇数位于偶数之前

传送门:《剑指Offer刷题总目录》

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


思路:两种方法

  1. 相对位置不变—>保持稳定性;奇数位于前面,偶数位于后面 —>存在判断,挪动元素位置;这些都和内部排序算法相似,考虑到具有稳定性的排序算法不多,例如插入排序,归并排序等;这里采用插入排序的思想实现。最坏情况下复杂度位O(n²)
  2. 用空间换时间,利用辅助数组
    一次循环,两个指针,一个从前往后,只看奇数,按序从头放进辅助数组里
    另一个从后往前找一遍,只看偶数,按序从尾巴放进辅助数组里
    然后把数据倒腾进原数组
    也保证了数据的稳定性有序性,时间和空间复杂度都为O(n)

Java代码

import java.time.Clock;
import java.util.Arrays;
import java.util.Random;

/**
 * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,
 * 所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
 */
public class ReOrderAraay {
    /**
     * 1.不借助额外的空间,利用插入排序的思想(稳定的排序)
     * 最坏情况下复杂度位O(n²)
     */
    public static void reOrderArray1(int[] array){
        //System.out.println("original array:"+Arrays.toString(array));
        int i=0;
        for(;i<array.length;i++) {
            if ((array[i] & 1) == 0) break;//遇到第一个偶数时跳出循环,找到了第一个奇数应改放置的位置
        }
        int odd=i;//下一个奇数需要放置的位置
        for(int j=odd;j<array.length;j++){
            if ((array[j] & 1) == 1){
                int data=array[j];
                for (int k=j;k>=(odd+1);k--){
                    array[k]=array[k-1];
                }
                array[odd++]=data;
            }
        }
       // System.out.println("reordered array:"+Arrays.toString(array));
    }

    /**
     *2.用空间换时间,借助额外的辅助数组
     * 一次循环,两个指针,一个从前往后,只看奇数,按序从头放进辅助数组里
     * 另一个从后往前找一遍,只看偶数,按序从尾巴放进辅助数组里
     * 然后把数据倒腾进原数组
     * 也保证了数据的稳定性有序性,时间和空间复杂度都为O(n)
     */
    public static void reOrderArray2(int[] array){
        int[] temp=new int[array.length];
        int odd=0;
        int even=array.length-1;//奇数和偶数指针
        int saveOdd=0;
        int saveEven=array.length-1;
        while(odd<array.length){
            if((array[odd]&1)==1) temp[saveOdd++]=array[odd++];
            else  odd++;
            if ((array[even]&1)==0) temp[saveEven--]=array[even--];
            else even--;
        }
        for(int i=0;i<array.length;i++)
            array[i]=temp[i];//结果倒腾回原数组
       // System.out.println(Arrays.toString(array));
    }
    public static int[] randArray(int n, int scale) {
        Random rand = new Random(47);
        int[] arr = new int[n];
        for (int i = 0; i < n; i++)
            arr[i] = rand.nextInt(scale);
        return arr;
    }

    public static void main(String[] args) {
        int[] a=randArray(20000,1000);
        int[] b=a.clone();
        long s = Clock.systemDefaultZone().millis();
        reOrderArray1(a);
        System.out.println("reOrderArray1耗时: " + (Clock.systemDefaultZone().millis() - s) + " ms");

        s = Clock.systemDefaultZone().millis();
        reOrderArray2(b);
        System.out.println("reOrderArray2耗时: " + (Clock.systemDefaultZone().millis() - s) + " ms");
        //运行结果:
        //reOrderArray1耗时: 80 ms
        //reOrderArray2耗时: 2 ms
    }
}
Lemon_keep 发布了17 篇原创文章 · 获赞 0 · 访问量 871 私信 关注

标签:NO.12,Java,按序,Offer,int,奇数,偶数,数组,array
来源: https://blog.csdn.net/qq_39618369/article/details/104447640