【问题标题】:Find greatest of two arrays, storing result in a third array [closed]查找两个数组中的最大值,将结果存储在第三个数组中[关闭]
【发布时间】:2014-05-21 08:10:16
【问题描述】:

如何在java中排序成两个数组并存储在另一个数组中?

public class SortingDemo {
    public static void main(String[] args) {
        int[] num1 = new int[ ] {5,6,2,8};
        int [] num2 = new int[]  {1,4,10,7};
        merge(num1, num2);
    }

    public static int[] merge(int [] num1,int [] num2) {
        int num1_size = num1.length;
        int num2_size = num2.length;
        for (int i = 0; i < num1.length; i++) {
            // System.out.println(num1[i]);
            for (int j = 0; j < num2.length; j++) {                 
                if (num1[i] > num2[j]) {

                }
            }
        }
    }
}

【问题讨论】:

    标签: java arrays sorting


    【解决方案1】:

    我想你对归并排序并不特别。您只需要创建第三个数组并将结果组合到第三个数组中并对其进行排序。

    我这种情况只是像

    这样创建一个新数组
    int[] num3 = new int[num1.length + num2.length];
    System.arraycopy(num1, 0, num3, 0, num1.length);
    System.arraycopy(num2, 0, num3, num1.length, num2.length);
    

    并使用任何排序算法对 num3 进行排序。

    但如果你对归并排序很讲究

    归并排序的工作原理如下

    • 将未排序的列表分成 n 个子列表,每个子列表包含 1 个元素(1 个元素的列表被视为已排序)。
    • 重复合并子列表以产生新的子列表,直到只剩下 1 个子列表。这将是排序列表。

    最后的程序是这样的

    import java.util.Arrays;
    
    public class SortingDemo {
        public static void main(String[] args) {
            int[] num1 = new int[] { 5, 6, 2, 8 };
            int[] num2 = new int[] { 1, 4, 10, 7 };
    
            // Combine both into thrid array
            int[] num3 = new int[num1.length + num2.length];
            System.arraycopy(num1, 0, num3, 0, num1.length);
            System.arraycopy(num2, 0, num3, num1.length, num2.length);
    
            // Sort third array
            mergeSort(num3);
            System.out.println(Arrays.toString(num3));
    
            // Largest number of two array
            System.out.println("Largest : " + num3[num3.length - 1]);
        }
    
        public static int[] mergeSort(int[] arrayData) {
            if (arrayData.length <= 1) {
                return arrayData;
            }
    
            int[] first = new int[arrayData.length / 2];
            int[] second = new int[arrayData.length - first.length];
            System.arraycopy(arrayData, 0, first, 0, first.length);
            System.arraycopy(arrayData, first.length, second, 0, second.length);
    
            mergeSort(first);
            mergeSort(second);
    
            merge(first, second, arrayData);
            return arrayData;
        }
    
        private static void merge(int[] first, int[] second, int[] result) {
            int iFirst = 0;
            int iSecond = 0;
    
            int j = 0;
            while (iFirst < first.length && iSecond < second.length) {
                if (first[iFirst] < second[iSecond]) {
                    result[j] = first[iFirst];
                    iFirst++;
                } else {
                    result[j] = second[iSecond];
                    iSecond++;
                }
                j++;
            }
            System.arraycopy(first, iFirst, result, j, first.length - iFirst);
            System.arraycopy(second, iSecond, result, j, second.length - iSecond);
        }
    }
    

    根据评论进行解释。

    您有两个数组,每个数组包含 4 个元素。 { 5, 6, 2, 8 }{ 1, 4, 10, 7 }。要求是创建一个组合这些数组的新数组,并对新创建的数组进行排序。所以不要先声明一个新数组。它的大小将是数组 1 的长度 + 数组 2 的长度。所以我们创建数组

    int[] num3 = new int[num1.length + num2.length];
    

    现在我们需要将两个数组中的值复制到新数组中。所以通常的做法是使用 System.arraycopy 方法。参数列表是(源数组、从源复制的初始位置、目标数组、在目标上复制的位置、要复制的元素总数)。所以我们会这样做

    System.arraycopy(num1, 0, num3, 0, num1.length);
    

    所以首先它从第 0 个索引开始的 num1 复制到新数组 num3,从第 0 个索引开始,所有元素都从 num1 开始。它相当于写 num3[0] = num1[0];数字 3[1] = 数字 1[1];等到 num1 的长度,如 num3[3] = num1[3]。 (即长度用于索引 0 到 4)。

    System.arraycopy(num2, 0, num3, num1.length, num2.length);
    

    所以当我们第二次复制时,我们已经在 num3 中有值,直到第 3 个索引。所以我们需要从第 4 个索引开始,即 num3[4] = num2[0]。这就是我们将第三个参数设置为 num1.length 的原因。其余类似于第一个副本。

    所以现在我们有了一个新数组,其中包含 num1 和 num2 的组合值。第二个要求是对其进行排序。如果您不想编写任何特殊的排序算法,您可以使用 Arrays 类提供的标准排序。喜欢

    Arrays.sort(num3);
    

    这将对新的组合数组进行排序。或者,我们可以编写您自己的排序。然后我们可以进行任何类型的排序。说冒泡排序或合并排序或快速排序或任何东西。您可以从http://www.sorting-algorithms.com/ 或通过http://thilinasameera.wordpress.com/2011/06/01/sorting-algorithms-sample-codes-on-java-c-and-matlab/ 的示例了解所有这些算法

    因为 cmets 是关于归并排序的,所以我只选择归并排序。这个想法或合并排序是将数组拆分为两个排序数组,然后按排序顺序将其合并到一个新数组中。所以在这种情况下,我们首先将 num3 分成两半。然后通过递归调用一次又一次地将每个分成两半,直到数组的大小为 1。这是在方法mergeSort() 的第一部分完成的,这意味着{5,6,2,8,1,4,10,7} 现在将变为{5},{6},{2},{8},{1},{4},{10},{7}。这里的想法是,如果一个数组只有 1 个元素,那么它可以被认为是已排序的。所以现在我们有 8 个数组。现在我们需要以排序方式合并这些,一次取 2 个数组。这就是merge() 方法的作用。

    首先我将采用 {5} 和 {6} 并以排序方式 {5,6} 合并为一个。然后将 {2} 和 {8} 合并到 {2,8} 等等以创建 4 个数组,每个数组有 2 个元素。 {5,6}、{2,8}、{1,4}、{7,10}。现在用这 4 个数组再次重复该过程,依此类推,直到我们得到一个数组。这将被排序。

    希望这会有所帮助。如果您还有其他问题,请询问。

    【讨论】:

    • 谢谢 Syam 是否还有其他我们必须进行相同类型的排序?
    • 一旦你有了组合列表,你就可以进行任何类型的排序。如果您不想编写排序算法,您甚至可以使用 Arrays.sort() 方法,例如 Arrays.sort(num3);
    • 怎么能告诉我我试过了,但似乎两者都一样,你能解释一下是如何工作的吗
    • 对不起哪一个?您需要对上述程序或 Arrays.sort 的解释吗?
    • 答案已更新并附有解释。
    【解决方案2】:

    或许,你应该这样做。

    public static void main(String[] a)
    {
        int[] num1= new int[] {5,6,2,8};
        int[] num2= new int[]  {1,4,10,7};
    
        System.out.println(getMax(num1, num2));
    }
    
    private static int getMax(int[] a, int[] b)
    {
        int max = Integer.MIN_VALUE;
    
        for (int val : a)
        {
            if (val > max)
                max = val;
        }
    
        for (int val : b)
        {
            if (val > max)
                max = val;
        }
    
        return max;
    }
    

    【讨论】:

    • Soundar 不工作
    • 它只给了我 10 个输出你能告诉更多如何做 Soundar
    • 我对您的问题的理解是-您想找出两个数组中项目的最大值。这就是返回 10 的原因,因为 10 是两个数组中的最大值。如果我的理解有误,请纠正我。如果您提供您期望的结果,那将会有所帮助。
    【解决方案3】:

    您想对数组进行排序并合并它们以获得排序后的数组吗?

    public static void main(String[] a) {
        int[] num1= new int[] {5,6,2,8};
        int[] num2= new int[]  {1,4,10,7};
        sortInPlace(num1);
        sortInPlace(num2);
        int[] result = merge(num1, num2);
    }
    

    实现 sortInPlace 和 merge 方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多