归并排序Java代码实现:
修改后代码:
原始代码(错误代码):
<span style="font-size:18px;">package data_structure;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Scanner;
public class MergeSort {
private int[] array;
public MergeSort() {
int i = 0, j, n;
Scanner scanner = new Scanner(System.in);
System.out.println("enter the length of array[]:");
n = scanner.nextInt();
array = new int[n];
System.out.println("enter the value of array[]:");
while (i < n) {
try {
j = scanner.nextInt();
} catch (InputMismatchException e) {
break;
}
array[i] = j;
i++;
}
}
public void merge(int left, int right, int merg[]) {
int middle = (left + right) / 2;
/*这里有猫腻*/
// if (merg.length == 1) {
// return;
//}
if (left < right) {</span><span style="font-size:18px;">
/*这里有问题*/
int le[] = Arrays.copyOfRange(merg, left, middle + 1);
int ri[] = Arrays.copyOfRange(merg, middle + 1, right + 1);</span><span style="font-size:18px;">
merge(left, middle, merg);
merge(middle + 1, right, merg);
organization(le, ri,left, right);
}
}
public void organization(int[] le, int[] ri, int left, int right) {
int i = left, l = 0, r = 0;
while (l < le.length && r < ri.length && i < right + 1) {
if (le[l] <= ri[r]) {
array[i] = le[l];
l++;
i++;
} else if (le[l] > ri[r]) {
array[i] = ri[r];
r++;
i++;
}
}
while (l < le.length && i < right + 1) {
array[i] = le[l];
l++;
i++;
}
while (r < ri.length && i < right + 1) {
array[i] = ri[r];
r++;
i++;
}
// System.out.print(array2+" ");
}
public static void main(String[] args) {
MergeSort mergeSort = new MergeSort();
mergeSort.merge(0, mergeSort.array.length - 1, mergeSort.array);
//System.out.print(mergeSort.array);
for(int a:mergeSort.array){
System.out.print(a+" ");
}
}
}
</span>
修改后代码:
<span style="font-size:18px;">package data_structure;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Scanner;
public class MergeSort {
private int[] array;
public MergeSort() {
int i = 0, j, n;
Scanner scanner = new Scanner(System.in);
System.out.println("enter the length of array[]:");
n = scanner.nextInt();
array = new int[n];
System.out.println("enter the value of array[]:");
while (i < n) {
try {
j = scanner.nextInt();
} catch (InputMismatchException e) {
break;
}
array[i] = j;
i++;
}
}
public void merge(int left, int right, int merg[]) {
int middle = (left + right) / 2;
if (merg.length == 1) {
return;
}
if (left < right) {
merge(left, middle, merg);
merge(middle + 1, right, merg);
int le[] = Arrays.copyOfRange(merg, left, middle + 1);
int ri[] = Arrays.copyOfRange(merg, middle + 1, right + 1);
organization(le, ri,left, right);
}
}
public void organization(int[] le, int[] ri, int left, int right) {
int i = left, l = 0, r = 0;
while (l < le.length && r < ri.length && i < right + 1) {
if (le[l] <= ri[r]) {
array[i] = le[l];
l++;
i++;
} else if (le[l] > ri[r]) {
array[i] = ri[r];
r++;
i++;
}
}
while (l < le.length && i < right + 1) {
array[i] = le[l];
l++;
i++;
}
while (r < ri.length && i < right + 1) {
array[i] = ri[r];
r++;
i++;
}
// System.out.print(array2+" ");
}
public static void main(String[] args) {
MergeSort mergeSort = new MergeSort();
mergeSort.merge(0, mergeSort.array.length - 1, mergeSort.array);
//System.out.print(mergeSort.array);
for(int a:mergeSort.array){
System.out.print(a+" ");
}
}
}
</span>
中间两句代码进行了修改,调换了位置,不然是不可能得到正确结果的,因为那样不符合归并排序逻辑,应该先是对子数组进行排序,排序成功了再进行合并,另外还要加上当数组长度为一的时候特殊情况的处理。
同时
<span style="font-size:18px;color:#CC0000;">int le[] = Arrays.copyOfRange(merg, left, middle + 1);</span>
也很关键,保证了数组长度为2特殊情况,如果这样就不可以
<span style="font-size:18px;color:#CC0000;">int le[] = Arrays.copyOfRange(merg, left, middle);</span>