/* All Contributors (C) 2020 */
package io.github.dreamylost.practice;

/**
 * @description 输入一个整数数组，实现一个函数来调整该数组中数字的顺序，
 *     使得所有的奇数位于数组的前半部分，所有的偶数位于位于数组的后半部分，并保证奇数和奇数，偶数和偶数之间的相对位置不变。
 * @author Mr.Li
 */
public class ReOrderArray {
    public static void main(String[] args) {
        int a[] = {1, 2, 3, 4, 5, 6, 7};
        reOrderArray(a);
    }

    /**
     * 1.要想保证原有次序，则只能顺次移动或相邻交换。 2.i从左向右遍历，找到第一个偶数。 3.j从i+1开始向后找，直到找到第一个奇数。
     * 4.将[i,...,j-1]的元素整体后移一位，最后将找到的奇数放入i位置，然后i++。 5.終止條件：j向後遍歷查找失敗。
     */
    public void reOrderArray3(int[] a) {
        if (a == null || a.length == 0) return;
        int i = 0, j;
        while (i < a.length) {
            while (i < a.length && !isEven(a[i])) i++;
            j = i + 1; // 从第一个偶数后面找奇数
            while (j < a.length && isEven(a[j])) j++;
            if (j < a.length && i < a.length) { // lgtm [java/constant-comparison]
                int tmp = a[j];
                for (int j2 = j - 1; j2 >= i; j2--) {
                    a[j2 + 1] = a[j2];
                }
                a[i++] = tmp;
            } else { // 查找失敗
                break;
            }
        }
    }

    boolean isEven(int n) {
        if (n % 2 == 0) return true;
        return false;
    }

    /** 整体思路： 首先统计奇数的个数 然后新建一个等长数组，设置两个指针， 奇数指针从0开始，偶数指针从奇数个数的末尾开始 遍历，填数 */
    public void reOrderArray2(int[] array) {
        if (array.length == 0 || array.length == 1) return;
        int oddCount = 0, oddBegin = 0;
        int[] newArray = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            // 奇数
            if ((array[i] & 1) == 1) oddCount++;
        }
        for (int i = 0; i < array.length; i++) {
            if ((array[i] & 1) == 1) newArray[oddBegin++] = array[i];
            else newArray[oddCount++] = array[i];
        }
        for (int i = 0; i < array.length; i++) {
            array[i] = newArray[i];
        }
    }
    /**
     * @description 直接处理
     * @param array
     */
    public static void reOrderArray(int[] array) {
        int left = 0;
        int right = 0;
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if ((array[i] & 1) == 0) {
                count++;
            }
        }
        int[] a = new int[array.length - count];
        int[] b = new int[count];
        for (int i = 0; i < array.length; i++) {
            if ((array[i] & 1) == 0) {
                b[right++] = array[i];
            } else {
                a[left++] = array[i];
            }
        }
        left = 0;
        right = 0;
        for (int i = 0; i < array.length; i++) {
            if (left < a.length) {
                array[i] = a[left++];
                continue;
            }
            if (right < b.length) {
                array[i] = b[right++];
                continue;
            }
        }
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}
