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

方法一:

分析:
要使得奇数全位于偶数前面,我们需要定义两个变量left和right,left从数组的0好下标开始往后遍历,right从数组的最后一个元素开始遍历,只有当left下标的元素为偶数并且right下标的元素为奇数时,我们才交换这两个元素,由此可见,无论是由left下标去寻找偶数还是由right下标去寻找奇数,我们都在循环里去寻找,找不到的话left往后移,right往前移,代码如下:

public static void main(String[] args) {
    int[] array = {1,2,3,4,5,6,7};
    reOrderArray(array);
    System.out.println(Arrays.toString(array));
}
public static void reOrderArray(int [] array) {
    int left = 0;
    int right = array.length-1;
    int tmp = 0;
    while(left < right) {
        while(left < right) {
            if(array[left]%2 != 0){
                left++;
                break;
            }else {
                break;
            }
        }
        while(left < right) {
            if(array[right]%2 == 0){
                right--;
                break;
            }else {
                break;
            }
        }
        if(left < right) {
            tmp = array[left];
            array[left] = array[right];
            array[right] = tmp;
            left++;
            right--;
        }
    }
}

运行结果如下:
在这里插入图片描述
方法二:

分析:方法一并不能保证奇数和奇数,偶数和偶数之间的相对位置不变,下面的方法就可以保证它们的相对位置不变。方法二的思想就是再定义一个数组,遍历两次数组,第一次是先将原数组的所有奇数放在新的数组前面,第二次是将原数组的所有偶数放在新数组的后面,代码如下:


public static void main(String[] args) {
    int[] array = {1,2,3,4,5,6,7};
    reOrderArray(array);
    System.out.println(Arrays.toString(array));
}

public static void reOrderArray(int [] array) {

    //1 2 3 4 5 6 7
    int[] ptr = new int[array.length];
    int j = 0;
    for(int i = 0; i < array.length; i++) {
        if(array[i]%2 != 0) {
            ptr[j] = array[i];
            j++;
        }
    }
    for(int i = 0; i < array.length; i++) {
        if(array[i] %2 == 0) {
            ptr[j] = array[i];
            j++;
        }
    }
    for(int i = 0; i < array.length; i++) {
        array[i] = ptr[i];
    }
}

运行结果如下:
在这里插入图片描述

在方法二这里我们引申一个知识点:

在Java中,方法的参数传递,对于基本类型都是按值传递,对对象来说,是将对象的引用传递给了方法,在方法中,只有对对象进行修改才能改变该对象的值,如果只修改对象的引用是不会修改对象的值的。对于上述方法二中最后的赋值,无论换成以下两种方法中的哪一个都是不可以的,方法一只是给形参赋值了一个新的引用,这样并不会改变方法外面数组的内容;而方法二只是给形参赋值了一组新的数据,也并不会改变方法外面数组的内容。

//方法一:
array = ptr;
//方法二:
array = Arrays.copyOf(ptr,ptr.length);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值