java - 即使在奇数之前,也使用递归按升序排列

标签 java sorting recursion mergesort

我需要能够有一个整数数组,将偶数整数放在奇数整数之前,然后按升序对数组进行排序。例如,给定数组 [1,2,3,4,5],最终产品应类似于 [2,4,1,3,5],因为您可以看到该数组在赔率之前都有偶数,然后将它们放置按升序排列。

正如您在代码中看到的,我正在使用数组 [10,9,8,7,6,5,4,3,2,1]。我得到的输出是 [1,2,3,4,5,6,7,8,9,10],但这是不正确的 - 它应该是 [2,4,6,8,10,1,3 ,5,7,9]。我无法使用任何内置函数或库。这是我到目前为止所拥有的:

public class EBOMain {

static int[] Array  = { 10,9,8,7,6,5,4,3,2,1};
static int n;

public static void main(String[] args) {


    System.out.print("Array before sort: "  );
    for (int i = 0; i < Array.length; i++)
        System.out.print(Array[i] +" ");
    n = Array.length;
    EvenBeforeOdd(Array, n);

    int[] Array2 = new int[Array.length];
    MergeSort(Array2, 0,Array.length - 1);

    System.out.print("\nArray after sort: "  );
    for (int i = 0; i < Array.length; i++)
        System.out.print(Array[i] +" ");        
}

public static void EvenBeforeOdd(int []Array,int n){
      if (n==0)
        return;
    else if(Array[n-1]%2==0) {
        for(int i=0;i<n-1;i++) {
            if(Array[i]%2!=0) {      
                int temp = Array[i];
                Array[i]= Array[n-1];
                Array[n-1] = temp;

                EvenBeforeOdd(Array,n-1);
            }
        }
    }
    else
        EvenBeforeOdd(Array,n-1);
 }

 static void MergeSort(int[] Combine, int LowerIndex, int UpperIndex) {

    if (LowerIndex == UpperIndex){
           return;

    }

    else {    // locate Pivot
           int Pivot = (LowerIndex + UpperIndex) / 2;
           MergeSort(Combine, LowerIndex, Pivot);
           MergeSort(Combine, Pivot + 1, UpperIndex);
           Merge(Combine, LowerIndex, Pivot + 1, UpperIndex);
    }

 }



    static void Merge(int[] Array2, int Small, int Large, int UpperIndex) {

        int Pivot = Large - 1;
        int LowerIndex = Small;
        int n = UpperIndex - LowerIndex + 1;
        int i = 0;

        while (Small <= Pivot && Large <= UpperIndex)
               if (Array[Small] < Array[Large])
                     Array2[i++] = Array[Small++];
               else
                     Array2[i++] = Array[Large++];

        while (Small <= Pivot)
               Array2[i++] = Array[Small++];

        while (Large <= UpperIndex)
               Array2[i++] = Array[Large++];

        for (i = 0; i < n; i++)
               Array[LowerIndex + i] = Array2[i];

 }







}

最佳答案

您只需要调用 MergeSort 两次即可。确定最后一个偶数在哪里,对偶数调用 MergeSort,然后对赔率调用 MergeSort。应该进行边界检查,以防没有偶数(此处不包括):

EvenBeforeOdd(Array, n);
int lastEven = 0;
for (int i=0; i<Array.length; i++) {
    if (Array[i] % 2 == 0)
        lastEven = i;
}
int[] Array2 = new int[Array.length];
MergeSort(Array2, 0, lastEven);
MergeSort(Array2, lastEven+1, Array.length - 1);

关于java - 即使在奇数之前,也使用递归按升序排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49602504/

相关文章:

java - ConcurrentModificationException : . add() 与 .addAll()

java - 如何在Java升序中按内部值对对象排序?

regex - 使用 bash 和 awk 将日志文件分组

c - 在带有 while 循环的 C 中使用递归函数的阶乘程序 c

sql-server - Sql Server 2012 中的递归衰减平均值

Java 错误 : javax. swing.JTable$1 无法转换为 javax.swing.table.DefaultTableModel

java - 是否可以使用 iText 以弧形书写文本

java - java中如何解析/转换(不确定这个术语)未知的数据类型

javascript - 按嵌套属性对字典的键进行排序

Javascript递归导致循环结构