我正在尝试实现合并排序,并且陷入了合并功能:
这是我的功能:
public static void merge(Comparable[] a, Comparable[] aux, int low, int mid, int hi) {
// Copy the elements to the aux array
for(int i = low; i < a.length; i++) {
aux[i] = a[i];
}
int i = low, j = mid + 1;
for (int k = low; k <= hi; k++) {
if (i > mid) a[k] = aux[j++];
else if (j > hi) a[k] = aux[i++];
else if (less(aux[j], aux[i])) a[k] = aux[j++];
else a[k] = aux[i++];
}
}
运行以下输入:
[2, 4, 6, 8, 3, 5, 7, 9]
产生这个结果:
[2, 3, 3, 3, 3, 5, 7, 9]
这是电话本身:
int mid = 0 + (my_array.length - 0) / 2;
MergeSort.merge(my_array, my_array, 0, mid -1, my_array.length-1);
我无法确定它。
答案 0 :(得分:1)
a
和aux
是相同的数组。所以,你首先将数组复制到自身,这是没用的。然后,在第二个循环中,您将更改正在读取的值,这会搞砸所有内容。
不是传递两个(相同的)数组,而是在merge方法中创建一个新数组并返回它。
答案 1 :(得分:1)
看来你实际上并不知道这里合并的意思。合并排序是一种分而治之的算法。这里,征服部分意味着你要合并两个排序的数组。因此,要合并它们,您始终将两个数组中的最低项放入输出数组的下一个位置,并将数组中的一个位置前进到该位置。
将此合并方法作为一个基本示例,只是为了得到这个想法。
public class MergeTest {
public static void main(String[] args) {
int[] sorted1 = new int[] {2, 5, 6, 8, 10};
int[] sorted2 = new int[] {1, 3, 4, 7, 9};
int[] result = merge(sorted1, sorted2);
// returns [1,2,3,4,5,6,7,8,9,10]
}
public static int[] merge (int[] input1, int[] input2) {
int[] output = new int[input1.length + input2.length];
int pos1 = 0;
int pos2 = 0;
while (pos1 < input1.length && pos2 < input2.length) {
int val1 = input1[pos1];
int val2 = input2[pos2];
if (val1 < val2) {
output[pos1++ + pos2] = val1;
} else {
output[pos1 + pos2++] = val2;
}
}
while (pos1 < input1.length) {
int val = input1[pos1];
output[pos1++ + pos2] = val;
}
while (pos2 < input2.length) {
int val = input2[pos2];
output[pos1 + pos2++] = val;
}
return output;
}
}
这里有一点额外的东西:mergeSort方法本身。
public static int[] mergeSort (int[] input) {
if (input.length == 1) {
return input;
}
int middle = input.length / 2;
// divide
int[] divided1 = Arrays.copyOfRange(input, 0, middle);
int[] divided2 = Arrays.copyOfRange(input, middle, input.length);
// conquer
int[] sorted1 = mergeSort(divided1);
int[] sorted2 = mergeSort(divided2);
return merge(sorted1, sorted2);
}