剑指offer 面试题12 调整数组顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

思路分析:

最简单的思路:从头到尾扫描数组,每次遇到一个偶数,则取出该数,将其后的所有数字向前移动1位,则可以将该数放置在数组末尾。每次碰到偶数需要移动O(n)O(n),则总的时间复杂度为O(n2)O(n2)


参考快速排序的思路:维护两个指针,第一个指针start初始指向第一个元素,向后移动;第二个指针end初始指向最后一个元素,向前移动。在两个指针相遇前,start总是在end前面。移动过程中如果遇到start指向的元素为偶数,并且end指向的元素为奇数,则交换两个元素。

代码如下

参考快速排序的思路:维护两个指针,第一个指针start初始指向第一个元素,向后移动;第二个指针end初始指向最后一个元素,向前移动。在两个指针相遇前,start总是在end前面。移动过程中如果遇到start指向的元素为偶数,并且end指向的元素为奇数,则交换两个元素。

代码:

    /**
     * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
     * 使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分
     * key:
     * 使用前后两个指针,从头部和尾部相向移动
     * 如果第一个指针为偶数,第二个指针为基数,则交换,
     * 直到第二个指针移动到第一个指针前面,结束循环;
     * @param array
     */
    public void reorder(int[] array) {
        if(array == null)
            return;

        int start = 0;
        int end = array.length - 1;
        while(start < end) {
            while(start < end && isEven(array[start])) 
                start++;

            while(start < end && !isEven(array[end]))
                end--;

            // 交换
            if(start < end) {
                swap(array, start, end);
            }
        }
    }

    // 判断是否是偶数
    public boolean isEven(int x) {
        return (x & 1) == 0 ? true : false;
    }

    // 交换数组元素
    public void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值