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

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

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;
 
 
        }
 
 
    }
 
}

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

posted @ 2019-09-16 19:21  小路不会迷路  阅读(151)  评论(0编辑  收藏  举报