我想你对归并排序并不特别。您只需要创建第三个数组并将结果组合到第三个数组中并对其进行排序。
我这种情况只是像
这样创建一个新数组
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 个数组再次重复该过程,依此类推,直到我们得到一个数组。这将被排序。
希望这会有所帮助。如果您还有其他问题,请询问。