Java 三向合并排序

Java 三向合并排序,java,arrays,merge,mergesort,Java,Arrays,Merge,Mergesort,我的任务是在java中实现类似于3路mergeshort的东西。我将有一个整数数组作为输入,我必须执行以下操作: 使用3路分割在阵列中实现mergesort,并打印阵列的3个已排序分区。例如,如果我将以下数组作为输入[9 23 10 90 70 10 3 23]输出将首先是排序的3个分区:[9 10 24][70 90][3 10 23]然后是排序的最终数组[3 9 10 10 23 24 70 90] 这就是我迄今为止所实施的: public static void mergesort(int

我的任务是在java中实现类似于3路mergeshort的东西。我将有一个整数数组作为输入,我必须执行以下操作:

使用3路分割在阵列中实现mergesort,并打印阵列的3个已排序分区。例如,如果我将以下数组作为输入
[9 23 10 90 70 10 3 23]
输出将首先是排序的3个分区:
[9 10 24]
[70 90]
[3 10 23]
然后是排序的最终数组
[3 9 10 10 23 24 70 90]

这就是我迄今为止所实施的:

public static void mergesort(int[] data) {
    int elements = data.length - 1;
    int length1;
    int length2;
    int length3;

    if (elements % 3 == 0) {
        length1 = elements / 3;
        length2 = elements / 3;
        length3 = elements / 3;
    } else if (elements % 3 == 1) {
        length1 = (elements / 3) + 1;
        length2 = elements / 3;
        length3 = elements / 3;
    } else { //if (elements % 3 == 2)
        length1 = (elements / 3) + 1;
        length2 = elements / 3;
        length3 = (elements / 3) + 1;
    }

    Arrays.sort(data, 0, length1 - 1);
    Arrays.sort(data, length1, length1 + length2 - 1);
    Arrays.sort(data, length1 + length2, length1 + length2 + length3 - 1);

    merge(data, 0, length1, length1 + length2);
    merge(data, 0, length1 + length2, length1 + length2 + length3);
}

private static void merge(int[] data, int first, int n1, int n2) {
    int[] temp = new int[n1 + n2];
    int copied = 0;
    int copied1 = 0;
    int copied2 = 0;
    int i;

    while ((copied1 < n1) && (copied2 < n2)) {
        if (data[first + copied1] < data[first + n1 + copied2]) {
            temp[copied++] = data[first + (copied1++)];
        } else {
            temp[copied++] = data[first + n1 + (copied2++)];
        }
    }

    while (copied1 < n1) {
        temp[copied++] = data[first + (copied1++)];
    }
    while (copied2 < n2) {
        temp[copied++] = data[first + n1 + (copied2++)];
    }

    for (i = 0; i < n1 + n2; i++) {
        data[first + i] = temp[i];
    }
}
公共静态无效合并排序(int[]数据){
int元素=data.length-1;
int长度1;
int长度2;
int长度3;
if(元素%3==0){
长度1=元素/3;
长度2=元素/3;
长度3=元素/3;
}else if(元素%3==1){
长度1=(元素/3)+1;
长度2=元素/3;
长度3=元素/3;
}else{//if(元素%3==2)
长度1=(元素/3)+1;
长度2=元素/3;
长度3=(元素/3)+1;
}
排序(数据,0,长度1-1);
排序(数据,长度1,长度1+长度2-1);
排序(数据,长度1+2,长度1+2+3-1);
合并(数据,0,长度1,长度1+长度2);
合并(数据,0,长度1+长度2,长度1+长度2+长度3);
}
私有静态无效合并(int[]数据,int-first,int-n1,int-n2){
int[]温度=新的int[n1+n2];
int=0;
int copied1=0;
int copied2=0;
int i;
而((复制1
我所做的是首先根据情况将数组拆分为3个部分,然后对数组的3个部分进行排序,然后尝试合并前2个部分,然后将合并的部分与最后一个部分合并

我已经为初学者实现了这两种方法,但首先我非常确信合并方法是糟糕的和错误的,其次我认为我在这个问题上的方法有问题,我觉得即使是mergesort方法也是错误的,实现得很糟糕

我想要的是关于我应该在这个问题上做什么以及我的实现有什么完全错误的建议

void merge(int arr1[],int arr2[])
void merge(int arr1[], int arr2[])
{
  int p1 = 0;
  int p2 = 0;
  int arr3[] = new int[arr1.length + arr2.length];

  while(p1 < arr1.length && p2 < arr2.length)
  {
    if(arr1[p1] > arr2[p2])
    {
      arr3[p2] = arr2[p2];
      p2++;
    }
    else
    {
      arr3[p1] = arr1[p1];
      p1++;
    }
  }

  //Now just add the code for just concatenating any remaining elements in 
  // either arr1 or arr2
  //This will happen if the lengths of arr1 and arr2 differ 


}
{ int p1=0; int p2=0; int arr3[]=新int[arr1.length+arr2.length]; 而(p1arr2[p2]) { arr3[p2]=arr2[p2]; p2++; } 其他的 { arr3[p1]=arr1[p1]; p1++; } } //现在,只需添加代码,以便在 //arr1或arr2 //如果arr1和arr2的长度不同,则会发生这种情况 }

这是合并两个数组(未测试,可能会错过边界条件)的基本代码。尝试将其合并到代码中

你到底应该如何将数组除以3?使用原始未排序数组的索引或其他方法?不,这很好。你能发布你的代码的输出/错误/异常吗?我的代码中实际上没有错误,只是我很确定它不起作用,但即使它起作用,这似乎不是解决问题的正确方法,这就是为什么我问我是否在做一些非常糟糕的事情,因为在我看来是这样的。顺便说一句,我还没有测试这些数字,我只知道到目前为止我的代码中没有错误