【问题标题】:Implement algorithm to merge sorted arrays and return it实现算法来合并排序的数组并返回它
【发布时间】:2023-03-04 06:57:02
【问题描述】:

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

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

  • 程序应生成一个二维数组数据,其维度为 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);
 }
}

编辑添加:

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

但是我的程序应该以二维形式返回它,并且数组可以超过两个: 程序应该生成一个维度为 k × n 的二维数组 data,存储 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; 
    }
}

【问题讨论】:

    标签: algorithm sorting merge mergesort n-way-merge


    【解决方案1】:

    试试这个..

    // 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

    【讨论】:

    • 干杯有帮助!这就是我到目前为止所得到的。下一个想法是??
    【解决方案2】:

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

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

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

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

    那么你就完成了。

    【讨论】:

    • 干杯!!以上是我到目前为止所得到的.. 但是对 2 Dim 的条件感到困惑,并且数组可以超过两个。下一步是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多