-1

我必须实现一个名为 Merge.java 的 Java 程序,其中包含以下算法实现:

  • 使用合并过程进行合并排序,合并前两个排序数组,然后合并第三个,依此类推。给定k个排序数组,每个数组有n 个元素,将它们组合成一个由 kn 个元素组成的单个排序数组。

  • 程序应该生成一个二维数组 data ,维度为k × n ,存储k个随机生成的长度为n的整数的排序数组。每个算法都应该将数据作为输入,并将所有k个列表合并为一个长度为k × n的数组结果。

public class Merge {

    int k = 2; int n = 4;
//generate a 2-dimensional array data with dimension k × n 
int[][] data = new int[k][n];
    int size = k*n;

//implementing merge procedure for merge sort   

    public static int[] merge(int data[][]){
 // First, creating a new array to store the single sorted array
        int res[] = new int[12];

然后我如何遍历数组并一一比较它们的元素并将它们按排序顺序插入新数组(res)中,这是按照问题的正确方法吗?

return res ;
}
    public static void printArray(int[] arr){
            for(int i : arr) {
                System.out.printf("%d ", i);
            }
    System.out.printf("n");
}

public static void main(String[]args){
Merge obj = new Merge();
int[][] array = new int[][]{{12, 8, 1, 5},{ 10, 3, 4, 23}};
int [] finalSorted = merge(array);
printArray(finalSorted);
 }
}

编辑添加:

都很有帮助..干杯..这是我到目前为止得到的:

但是,我的程序应该以二维形式返回它,并且数组可以超过两个:程序应该生成一个二维数组 data ,其维度为k × n ,存储k个随机生成的长度为n的整数的排序数组。每个算法都应该将数据作为输入,并将所有k个列表合并为一个长度为k × n的数组结果。下一步是什么?

//merge method take takes two arrays as parameters and returns the merge array

public int[]  merge(int[] array1 , int [] array2){
int i=0,j=0,k = 0;
int m=array1.length; 
int n=array2.length ;   

// declaring a to be returned array after merging those two array1 & array2     

int[] mergedArray = new int[m+n];


//comparing between two arrays , write it and compare next element and so on

 while(i< m && j<n){
            if(array1[i]<= array2[j]){

// if first element of array1 is <= then array2 then place array1 element in the mergedArray and viceversa

mergedArray[k] = array1[i];
                    i++;
            }else{
                mergedArray[j]=array2[j]; // opposite of above 
                j++;
            } 
            k++ ;
        }

// when run out of elements from one or other array, just write all the elements from the other

if(i<m){
            for(int p=i ; p<m ; p++){
                mergedArray[k] = array1[p];
                k++;
            }
        } else {
            for(int p=j ; p<n ; p++){
                mergedArray[k]=array2[p];
                k++;
            }
        }
        return mergedArray; 
    }
}
4

2 回答 2

0

尝试这个..

// size of C array must be equal or greater than
// sum of A and B arrays' sizes
public void merge(int[] A, int[] B, int[] C) {
      int i, j, k, m, n;
      i = 0;
      j = 0;
      k = 0;
      m = A.length;
      n = B.length;
      while (i < m && j < n) {
            if (A[i] <= B[j]) {
                  C[k] = A[i];
                  i++;
            } else {
                  C[k] = B[j];
                  j++;
            }
            k++;
      }
      if (i < m) {
            for (int p = i; p < m; p++) {
                  C[k] = A[p];
                  k++;
            }
      } else {
            for (int p = j; p < n; p++) {
                  C[k] = B[p];
                  k++;
            }
      }
}

参考链接:http ://www.algolist.net/Algorithms/Merge/Sorted_arrays

于 2015-08-17T12:50:57.560 回答
0

让我给你一些正确方向的指示,而不是仅仅发布答案。

首先,您需要一个 merge() 方法,该方法将两个数组作为参数并返回合并后的数组。这意味着应该在 merge() 方法本身内声明和分配返回的数组。

然后只需逐个元素地查看两个数组。如果 a 中的当前元素小于 b 的当前元素,则写入它并从 a 中获取下一个元素。如果 b 中的当前元素小于 a 中的当前元素,则将其写入并从 b 中获取下一个元素。当你用完一个或另一个数组中的元素时,只需写入另一个数组中的所有元素。

您将使用生成的前两个数组调用此方法。然后,您将使用第一次合并的结果和其余生成的数组之一调用它。继续这样做,直到您合并所有生成的数组,一次一个。

然后你就完成了。

于 2015-08-17T14:26:13.853 回答