Java MergeSort在数组中放入零
MergeSort.java:Java MergeSort在数组中放入零,java,sorting,merge,mergesort,array-merge,Java,Sorting,Merge,Mergesort,Array Merge,MergeSort.java: public class MergeSort { public static void run(int[] array, int size) { mergeSort(array, 0, size - 1); } private static void mergeSort(int[] array, int i, int f) { if (i >= f) { return
public class MergeSort {
public static void run(int[] array, int size) {
mergeSort(array, 0, size - 1);
}
private static void mergeSort(int[] array, int i, int f) {
if (i >= f) {
return;
}
int m = (i + f) / 2;
mergeSort(array, i, m);
mergeSort(array, m + 1, f);
merge(array, i, m, f);
}
private static void merge(int[] array, int i1, int f1, int f2) {
int[] aux = new int[f2 - i1 + 1];
int startSave = i1;
int endSave = f2;
int i2 = f1 + 1;
int i = 0;
while (i1 <= f1 && i2 <= f1) {
if (array[i1] <= array[i2]) {
aux[i] = array[i1];
++i;
++i1;
} else {
aux[i] = array[i2];
++i;
++i2;
}
}
if (i1 < f1) {
while (i1 <= f1) {
aux[i] = array[i1];
++i;
++i1;
}
} else {
while (i2 <= f2) {
aux[i] = array[i2];
++i;
++i2;
}
}
int k = 0;
for (int j = startSave; j <= endSave; ++j) {
array[j] = aux[k];
++k;
}
}
}
或
或
我不知道为什么这样不行。为什么它只打印一个元素,而所有其他元素都是零?而且第一个元素甚至不是最小值。。。所以代码中一定有什么地方出了问题。你能帮我吗?我不知道我做错了什么您的代码几乎是正确的,除了一些错误:
合并中的第一个while循环应该是while i1您的代码几乎是正确的,除了一些错误:
merge中的第一个while循环应该是while i1除了Aziz的深刻回答之外,我想强调一下mergeSort中包含边界I和f的约定可能会造成的混乱。Passinf作为切片后第一个值的索引的上边界允许更简单的代码,无需+1/-1调整,并且使用更惯用的除了Aziz的深刻回答之外,我想强调一下在mergeSort中包含边界I和f的约定可能造成的混乱。Passinf作为切片后第一个值的索引的上边界允许更简单的代码,无需+1/-1调整,并且更惯用
import java.util.Random;
public class Main {
public static void main(String args[]) {
Main m = new Main();
m.run();
}
private void run() {
Random r = new Random();
int size = 8;
int[] array = new int[size];
int el = 0;
for (int i = 0; i < size; ++i) {
el = r.nextInt(50); // randomly fills the array
array[i] = el;
System.out.print(array[i] + " "); // prints each element
}
System.out.println("");
MergeSort.run(array, size);
for (int i = 0; i < size; ++i) {
System.out.print(array[i] + " "); // print each element to know if array is sorted
}
System.out.println("");
}
}
$ java Main
30 38 14 29 42 44 43 34
38 0 0 0 0 0 0 0
17 29 4 17 13 21 47 19
17 0 0 0 0 0 0 0
41 25 38 49 7 4 26 46
25 0 0 0 0 0 0 0
public class MergeSort {
public static void run(int[] array, int size) {
mergeSort(array, 0, size);
}
private static void mergeSort(int[] array, int i, int f) {
if (f - i < 2) {
return;
}
int m = i + (f - i) / 2; /* avoid potential overflow on `(i + f) / 2`
mergeSort(array, i, m);
mergeSort(array, m, f);
merge(array, i, m, f);
}
private static void merge(int[] array, int i1, int f1, int f2) {
int[] aux = new int[f2 - i1];
int startSave = i1;
int endSave = f2;
int i2 = f1;
int i = 0;
while (i1 < f1 && i2 < f1) {
if (array[i1] <= array[i2]) {
aux[i++] = array[i1++];
} else {
aux[i++] = array[i2++];
}
}
while (i1 < f1) {
aux[i++] = array[i1++];
}
while (i2 < f2) {
aux[i++] = array[i2++];
}
int j = startSave;
for (int k = 0; k < i; k++) {
array[j++] = aux[k];
}
}
}