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

一开始想着暴力,后来才发现那个就是插入排序的思想,后来用归并排序给做出来了,下面是我的代码和别人的解法

public class Solution {
    public void reOrderArray(int [] array) {
        helper(array,0,array.length-1);
    }
    public void helper(int[] array,int l,int r)
    {
        if(l>=r)
            return ;
        int mid=l+(r-l)/2;
        helper(array,l,mid);
        helper(array,mid+1,r);
        int[] aux=new int[r-l+1];
        for(int i=l;i<=r;i++)
            aux[i-l]=array[i];
        int index=l;
        int left=r+1;
        int right=r+1;
        for(int i=l;i<=mid;i++)
            if(aux[i-l]%2==1)
                array[index++]=aux[i-l];
            else
            {
                 left=i;
                 break;
            }
               
        for(int i=mid+1;i<=r;i++)
        {
            if(aux[i-l]%2==1)
                array[index++]=aux[i-l];
            else
             {
                 right=i;
                 break;
             }
        }
        for(;left<=mid;left++)
            array[index++]=aux[left-l];
        for(;right<=r;right++)
            array[index++]=aux[right-l];
        return ;
    }
}

//下面是别人的实现分别用归并和插排实现的:

链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?answerType=1&f=discussion
来源:牛客网

1.归并排序法,使用链表或数组容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.ArrayList;
public class Solution {
     public void reOrderArray( int [] array) {
         if (array.length== 1 ||array.length== 0 ) return ;
         merge(array);
     }
 
     public void merge( int [] arr)
     {
         ArrayList<Integer> left = new ArrayList();
         ArrayList<Integer> right = new ArrayList();
 
         for ( int i: arr)
         {
             if ((i& 1 )== 0 ) //偶数
             {
                 right.add(i);
             } else {
                 left.add(i);
             }
         }
         int r = arr.length- 1 ;
         do {
             arr[r--]=right.remove(right.size()- 1 );
         } while (right.size()!= 0 );
 
         do {
             arr[r--]=left.remove(left.size()- 1 );
         } while (left.size()!= 0 );
     }
 
}

方法二: 插入排序法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.ArrayList;
public class Solution {
     public void reOrderArray( int [] array) {
         if (array.length== 1 ||array.length== 0 ) return ;
         handle(array);
 
     }
 
     public void handle( int [] arr)
     {
         for ( int i= 0 ,j;i<arr.length;++i)
         {
             if ((arr[i]& 1 )== 0 ) continue ; //arr[i] 是奇数,并且前一位是偶数
             int curNode = arr[i];
             for ( j=i;j> 0 &&(arr[j- 1 ]& 1 )== 0 ;)
             {
                 arr[j--]=arr[j];
             }
             arr[j]=curNode;
 
 
         }
 
 
     }
 
}

两种方法,看你是想要快,还是内存小

转载于:https://www.cnblogs.com/cold-windy/p/11529143.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值