首页 > 解决方案 > 如何将所有偶数按顺序排列,先出现,再出现奇数?

问题描述

我遇到的问题是如何重新排列 int 值数组,以便所有偶数值出现在所有奇数值之前。下面是我的编码:

   import java.io.*; 

  public class EvenAppearBeforeOdd {
// function to rearrange the array in given way. 
static void rearrangeEvenAndOdd(int arr[], int n) 
{ 
    // variables 
    int j = -1,temp; 

    // quick sort method 
    for (int i = 0; i < n; i++) { 

        // if array of element 
        // is odd then swap 
        if (arr[i] % 2 == 0) { 

            // increment j by one 
            j++; 

            // swap the element 
            temp = arr[i]; 
            arr[i] = arr[j]; 
            arr[j] = temp; 
        } 
    } 
} 

// Driver code 
public static void main(String args[]) 
{ 
    int arr[] = { 15, 9, 1, 3, 10, 5, 4, 8 }; 
    System.out.println("\n\nBefore\n");
    System.out.println(arr[]);
     try {
        System.out.println(EvenAppearBeforeOdd.rearrangeEvenAndOdd(arr);
    } catch (Exception e) {
        System.out.println("Error!!!");
   }
    int n = arr.length; 

    rearrangeEvenAndOdd(arr, n); 
  System.out.println("\n\nAfter\n");
    for (int i = 0; i < n; i++) 
        System.out.print(arr[i] + " "); 
} 
  } 

错误输出如下所示:

  run:
  C:\Users\User\AppData\Local\NetBeans\Cache\8.0.2\executor-snippets\run.xml:48: 
  Cancelled by user.
  BUILD FAILED (total time: 3 seconds)

实际上我想要如下输出:

  run:


  Before

  15 9 1 3 10 5 4 8 


  After

  10 4 8 3 15 5 9 1 BUILD SUCCESSFUL (total time: 0 seconds)

希望有人能帮我检查一下我错了哪一部分的编码?非常感谢。

标签: javaarrays

解决方案


下面给出的是产生与您的示例输入和输出匹配的结果的答案:

public class EvenAppearBeforeOdd {    
    static void rearrangeEvenAndOdd(int arr[]) {
        int j = 0, temp;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) {
                temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;
                j++;
            }
        }
    }
    static void printArray(int arr[]) {
        for(int i=0;i<arr.length;i++)
            System.out.print(arr[i]+"\t");
        System.out.println();
    }
    public static void main(String args[]) {
        int arr[] = { 15, 9, 1, 3, 10, 5, 4, 8 };
        System.out.println("Before:");
        printArray(arr);
        rearrangeEvenAndOdd(arr);
        System.out.println("After:");
        printArray(arr);
    }
}

您可以将您的答案与它进行比较,并轻松找到错误。如果您仍有任何问题,请随时发表评论。

更新 [2019 年 10 月 6 日 19:00]:

为了解决WJS提出的问题,rearrangeEvenAndOdd方法可以写成:

static void rearrangeEvenAndOdd(int arr[]) {
    int j, temp;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] % 2 == 0) {
            temp = arr[i];
            j=i-1;
            while(j>=0 && arr[j]%2==1) {
                arr[j+1]=arr[j];
                j--;
            }
            arr[j+1]=temp;
        }
    }
}

但是,它不会产生与您的样本输入和输出匹配的结果,即输入数组为 { 15, 9, 1, 3, 10, 5, 4, 8 },结果将产生为 {10, 4, 8 , 15, 9, 1, 3, 5} 而不是作为样本输出 {10, 4, 8, 3, 15, 5, 9, 1}。


推荐阅读