前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指Offer-调整数组顺序使奇数位于偶数前面

剑指Offer-调整数组顺序使奇数位于偶数前面

作者头像
武培轩
发布2018-04-16 17:50:15
8170
发布2018-04-16 17:50:15
举报
文章被收录于专栏:武培轩的专栏武培轩的专栏

题目描述

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

思路

思路一:

首先统计奇数的个数,然后拷贝一个数组,设置两个指针,奇数指针从0开始,偶数指针从奇数个数的末尾开始遍历,填充到原数组

时间复杂度\(O(n)\) 空间复杂度\(O(n)\)

思路二:

由于要保证稳定即证奇数和奇数,偶数和偶数之间的相对位置不变,使用插入排序思想

时间复杂度\(O(n^2)\) 空间复杂度\(O(1)\)

代码实现

package Array;

/**
 * 调整数组顺序使奇数位于偶数前面
 * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
 */
public class Solution48 {
    public static void main(String[] args) {
        Solution48 solution48 = new Solution48();
        int[] array = {1, 2, 3, 4, 5, 6};
        solution48.reOrderArray_2(array);
        for (int i :
                array) {
            System.out.print(i + " ");
        }
    }

    /**
     * 由于要保证稳定即证奇数和奇数,偶数和偶数之间的相对位置不变,使用插入排序思想
     * 复杂度:O(N2) + O(1)
     *
     * @param array
     */
    public void reOrderArray_2(int[] array) {
        if (array.length == 0 || array == null)
            return;
        int n = array.length;
        for (int i = 0; i < n; i++) {
            if (array[i] % 2 == 0) {
                int nextOddIdx = i + 1;
                while (nextOddIdx < n && array[nextOddIdx] % 2 == 0) {
                    nextOddIdx++;
                }
                if (nextOddIdx == n) {
                    break;
                }
                int nextOddVal = array[nextOddIdx];
                for (int j = nextOddIdx; j > i; j--) {
                    array[j] = array[j - 1];
                }
                array[i] = nextOddVal;
            }
        }
    }

    /**
     * 新建一个数组
     * 复杂度:O(N) + O(N)
     *
     * @param array
     */
    public void reOrderArray(int[] array) {
        int oddCnt = 0;
        for (int val : array) {
            if (val % 2 == 1) {
                oddCnt++;
            }
        }
        int[] copy = array.clone();
        int i = 0, j = oddCnt;
        for (int num : copy) {
            if (num % 2 == 1) {
                array[i++] = num;
            } else {
                array[j++] = num;
            }
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档