调整数组顺序使奇数在偶数前面

1. 牛客网上那道还有附加条件“奇数与奇数的先后次序不变,偶数与偶数的先后次序保持不变”。这里我只想到一种很low的暴力方法,就是遍历,空间复杂度为O(N),时间复杂度为O(2N)。

        int pointer=0;
        int[] arr_answer=array.clone();
        for(int elem : arr_answer){
            if(elem%2==1){
                array[pointer++]=elem;
            }
        }
        for(int elem : arr_answer){
            if(elem%2==0){
                array[pointer++]=elem;
            }
        }

当然,也可以设置指针,找到第一个偶数(指针i)后,找到偶数后的第一个奇数(指针j),然后将从i到j的数组段整体移动,空间复杂度为O(1),但是时间复杂度是O(n^2);或者简单粗暴二层循环,类似冒泡。(这个代码来自网络)

链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593
来源:牛客网

        for (int i = 0; i < array.size();i++)
        {
            for (int j = array.size() - 1; j>i;j--)
            {
                if (array[j] % 2 == 1 && array[j - 1]%2 == 0) //前偶后奇交换
                {
                    swap(array[j], array[j-1]);
                }
            }
        }

 

2. 如果不加这个条件,那么可以用类似快排的思路,不稳定是真的。

        int tmp;
        int i=0,j=array.length-1;
        while(i<j){
            while(array[i]%2!=0&&i<j) i++;
            while(array[j]%2==0&&i<j) j--;
            tmp=array[i];
            array[i]=array[j];
            array[j]=tmp;
            i++;j--;
        }

或者设置两个指针,当i指向偶数,命令j找到i之后的第一个奇数,进行交换。

        int tmp;
        int i=0,j=0,l=array.length-1;
        while(j<l&&i<l){
            while(array[i]%2==1&&i<l) i++;
            j=i+1;
            while(array[j]%2==0&&j<l) j++;
            if(i<j&&j<l){
                tmp=array[i];
                array[i]=array[j];
                array[j]=tmp;
            }
            i++;
        }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值