zoukankan      html  css  js  c++  java
  • 数组奇数左边偶数右边位置不变

    代码如下:自己看吧

    public class TestOdd {
        
            public static void  reOrderArray(int [] array) {
                int[] tempArr = new int[array.length];
                int j = 0;
                for(int i=0; i<array.length; i++) {
                    if ( (array[i] % 2) != 0) {
                        tempArr[j++]=array[i];
                    }
                }
                for(int i=0; i<array.length; i++) {
                    if ((array[i]%2)==0) {
                        tempArr[j++]=array[i];
                    }
                }
               int k = 0; 
               while(k<array.length) {
                   array[k]=tempArr[k];
                   k++;
               } 
            }
            public static void main(String[] args) {            
                int[] array = {1,3,5,2,56,62,7,28,9};
                reOrderArray(array);
                for (int i = 0; i < array.length; i++) {
                    System.out.print(array[i]+" ");
                }
                
            }
    }

    结果:

    聊聊快排吧,这个有点类似快排的感觉

      1、外面的大while条件是left<right

      2、两个指针  一个左边  一个右边

      3、如果两个指针所属的 值都属性是一样 (都是偶数  都是奇数)

      4、来个while 根据实际情况移动下指针  移动到值属性不一样为止

      5、不一样时候 判断如果左边是偶数 右边是奇数的情况下 需要swap

    但是如果这么玩儿的话肯定是 顺序不满足:看我的代码思路实现:

      

    public class Test1 {
    
        public static void reOrderArray(int[] array) {
    
            int left = 0;
            int right = array.length - 1;
            while (left < right) {
                while (array[left]%2 !=0 && array[right]%2 !=0){  //都是奇数 移动左边 匹配到可以交换为之
                    left++;
                }
                while(array[left]%2 == 0 && array[right]%2 ==0){ //都是偶数  移动右边 匹配到可以交换为之
                     right--;
                  }
                if (array[left]%2==0 && array[right]%2 !=0){
                    swamp(left,right,array);
                }
               left++;
               right--;
            }
    
        }
    
        public static void swamp(int left, int right, int[] arr) {
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
    
        public static void main(String[] args) {
            int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
            reOrderArray(array);
            for (int i = 0; i < array.length; i++) {
                System.out.print(array[i] + " ");
            }
        }
    }

    实现结果是这样: 保证左右的奇数偶数属性 但是不能保证顺序

     

    所以我采取下面的策略:

      双指针

      第一个去移动,移动到 偶数为止

      第二个去寻找,寻找到奇数 与之交互

        

    public class Test2 {
        public static  void sortOdd(int[] arr){
            int left=0;
            int right=1;
    
           while (right<arr.length && left<arr.length){
    
              if (arr[left]%2 == 0){  //当前为偶数
                  while (right < arr.length-1 && arr[right]%2 ==0 ){ //用right去寻找奇数  注意这里一定要判断下right下表的值 才可以继续往下进行 否则数组没有下标 直接越界啊
                      right++;
                  }
                  swamp(left,right,arr);
                  left++;
                  right=left+1;
              }
             //如果当前为奇数  移动当前位置 移动到偶数为之
               while (arr[left]%2 !=0 ){  //奇数就对了 继续往后遍历
                  left++;
                  right=left+1;
               }
           }
        }
        public static void swamp(int left, int right, int[] arr) {
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
    
        public static void main(String[] args) {
            int[] array = {1,2,3,4,5,6,7,8,9};
            sortOdd(array);
            for (int i = 0; i < array.length; i++) {
                System.out.print(array[i] + " ");
            }
        }
    }
  • 相关阅读:
    linux系统更新及开启自动更新
    关于ICO的一些理解
    中小学教育缴费遇到的一些问题
    中小学教育缴费----支付宝回传数据.net core 接收中文乱码
    中小学教育缴费——验签失败
    C# MVC+EF—WebApi
    C# MVC+EF—页面搭建
    C# MVC+EF—结构搭建
    EF中的预先加载和延迟加载
    WebApi路由
  • 原文地址:https://www.cnblogs.com/toov5/p/10414566.html
Copyright © 2011-2022 走看看