调整数组顺序使得奇数位于偶数之前

题目描述:

调整之后,不关心大小顺序。

如数组:[1,2,3,4,5,6]

调整后可能是:[1, 5, 3, 4, 2, 6]

解题思路:

·可以使用常用的双指针方法,利用“两头向中间调整”对数据进行排序。

·两个数据之间有三种情况

1.左指针是偶数右指针是奇数

使用冒泡排序类似的方法,交换数据(指针移动)

2.两个都是奇数

因为要保持奇数在偶数之前,所以当左指针代表数字是奇数时,左指针向右移动

3.两个都是偶数

因为要保持奇数在偶数之前,所以当右指针代表数字是偶数数时,左指针向左移动

当左指针小于右指针(下标)时停止大循环。

public class changeNum {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6};
        rearrange(arr);
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
    public static void rearrange(int[] arr) {
        int n = arr.length;
        int left = 0, right = n - 1;
        while (left < right) {
            // 找到左边是偶数,右边是奇数时,交换
            if (arr[left] % 2 == 0 && arr[right] % 2 != 0) {
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
                left++;
                right--;
            }
            // 移动左指针
            if (arr[left] % 2 != 0) {
                left++;
            }
            // 移动右指针
            if (arr[right] % 2 == 0) {
                right--;
            }
        }
    }
}

进阶:还要考虑数字之间顺序

分成两部分数组,继续使用冒泡排序的方法(已经存在)sort(),最后把两段数组结合在一起。

import java.util.Arrays;

public class changeNum2 {

        public static void main(String[] args) {
            int[] arr = {1, 2, 3, 4, 5, 6}; // 初始数组
            rearrangeAndSort(arr); // 调整数组并排序
            // 打印调整后的数组
            for (int num : arr) {
                System.out.print(num + " ");
            }
        }

        public static void rearrangeAndSort(int[] arr) {
            int n = arr.length;
            int left = 0, right = n - 1;

            // 先进行奇数和偶数的分离,双指针法
            while (left < right) {
                // 如果arr[left]是偶数,arr[right]是奇数,交换
                if (arr[left] % 2 == 0 && arr[right] % 2 != 0) {
                    // 交换
                    int temp = arr[left];
                    arr[left] = arr[right];
                    arr[right] = temp;
                    left++;
                    right--;
                }

                // 如果arr[left]是奇数,向右移动left
                if (arr[left] % 2 != 0) {
                    left++;
                }

                // 如果arr[right]是偶数,向左移动right
                if (arr[right] % 2 == 0) {
                    right--;
                }
            }

            // 分别对奇数部分和偶数部分进行排序
            // 奇数部分的排序
            int[] oddArr = Arrays.copyOfRange(arr, 0, left);
            Arrays.sort(oddArr);

            // 偶数部分的排序
            int[] evenArr = Arrays.copyOfRange(arr, left, n);
            Arrays.sort(evenArr);

            // 将排序后的奇数和偶数数组合并回原数组
            System.arraycopy(oddArr, 0, arr, 0, oddArr.length);
            System.arraycopy(evenArr, 0, arr, oddArr.length, evenArr.length);
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值