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


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

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

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

  • 相关阅读:
    MAC OpenGL 环境搭建
    C++中调用OC代码
    XCode快捷键使用
    【iOS】史上最全的iOS持续集成教程 (下)
    【iOS】史上最全的iOS持续集成教程 (上)
    pod 指令无效
    iOS面试题总结(持续更新)
    数据结构与算法思维导图
    Swift编码规范总结
    同步异步执行问题
  • 原文地址:https://www.cnblogs.com/cold-windy/p/11529143.html
Copyright © 2020-2023  润新知