数组奇数左边偶数右边位置不变

 

代码如下:自己看吧

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] + " ");
        }
    }
}

 

posted @ 2019-02-21 18:48  toov5  阅读(316)  评论(0编辑  收藏  举报