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

/**
 * 输入一个整数数组,
 * 实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,
 * 并保证奇数和奇数,偶数和偶数之间的相对位置不变。
 * 解:利用排序算法的稳定性来解
 */

public class Solution4 {

    
public static void main(String[] args) {
    int[] i = new int[]{9, 22, 23, 24, 14, 15, 16, 17, 6, 10, 11, 12};
    int[] n = mergeSort(i, new int[i.length], 0, i.length - 1);
    for (int k : n) {
        System.out.print(k + ",");
    }

}
    /**
     * 冒泡
     *
     * @param arrays
     * @return
     */
    public static int[] solution(int[] arrays) {
        if (null == arrays || 0 == arrays.length)
            return arrays;

        int[] newrrays1 = new int[arrays.length];
        int[] newrrays2 = new int[arrays.length];
        int j = 0, o = 0;
        for (int a : arrays) {
            if (0 != a % 2)
                newrrays1[j++] = a;
            else
                newrrays2[o++] = a;
        }
        int k = 0;
        while (k < j) {
            arrays[k] = newrrays1[k++];
        }

        int g = 0;
        while (g < o) {
            arrays[k++] = newrrays2[g++];
        }

        return arrays;
    }

    /**
     * @param arrays
     * @return
     */
    public static int[] mergeSort(int[] arrays, int[] copyarrays, int left, int right) {
        int length = right - left + 1;
        if (null == arrays || 1 >= length)
            return arrays;

        if (length == 2) {//长度为2的时候进行排序
            merge(arrays, copyarrays, left, right);
            return arrays;
        }

        int mid = (left + right) / 2;
        //left sort
        mergeSort(arrays, copyarrays, left, mid);
        //right sort
        mergeSort(arrays, copyarrays, mid + 1, right);
        //merge
        merge(arrays, copyarrays, left, right);

        return arrays;
    }

    public static void merge(int[] l, int[] c, int left, int right) {
        int length = right - left + 1;
        if (length == 2) {//奇偶位置相反时候进行排序
            int tmp;
            if (0 == l[left] % 2 && 0 != l[right] % 2) {
                tmp = l[left];
                l[left] = l[right];
                l[right] = tmp;
            }
            return;
        }
        int mid = (left + right) / 2;//合并数组的中间索引值
        int lborder = mid;//左数组的右边界
        int rborder = right;//右数组的右边界

        int le = left;//左数组起始指针
        int ri = mid + 1;//右数组起始指针
        int cleft = left;//临时数组起始指针

        while (cleft <= right) {//合并操作
            if (le > lborder) {
                //right into c
                while (ri <= rborder)
                    c[cleft++] = l[ri++];
                break;
            }
            if (ri > rborder) {
                //left into c
                while (le <= lborder)
                    c[cleft++] = l[le++];
                break;
            }

            if (0 != l[le] % 2)
                c[cleft++] = l[le++];
            else if (0 != l[ri] % 2)
                c[cleft++] = l[ri++];
            else
                c[cleft++] = l[le++];

        }

        while (left <= right) {//将合并完的结果覆盖原来数据段
            l[left] = c[left++];
        }

    }
}





































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值