我是Java新手,并尝试在Java中实现mergesort。但是,即使在多次运行该程序之后,也没有获得所需的排序输出,而是获得了与输入相同的用户作为输入。如果有人可以帮助我了解这种意外行为,我将非常感激。
import java.io.*; import java.util.Arrays; public class MergeSort { public static void main(String[] args) throws IOException{ BufferedReader R = new BufferedReader(new InputStreamReader(System.in)); int arraySize = Integer.parseInt(R.readLine()); int[] inputArray = new int[arraySize]; for (int i = 0; i < arraySize; i++) { inputArray[i] = Integer.parseInt(R.readLine()); } mergeSort(inputArray); for (int j = 0; j < inputArray.length; j++) { System.out.println(inputArray[j]); } } static void mergeSort(int[] A) { if (A.length > 1) { int q = A.length/2; int[] leftArray = Arrays.copyOfRange(A, 0, q); int[] rightArray = Arrays.copyOfRange(A,q+1,A.length); mergeSort(leftArray); mergeSort(rightArray); A = merge(leftArray,rightArray); } } static int[] merge(int[] l, int[] r) { int totElem = l.length + r.length; int[] a = new int[totElem]; int i,li,ri; i = li = ri = 0; while ( i < totElem) { if ((li < l.length) && (ri<r.length)) { if (l[li] < r[ri]) { a[i] = l[li]; i++; li++; } else { a[i] = r[ri]; i++; ri++; } } else { if (li >= l.length) { while (ri < r.length) { a[i] = r[ri]; i++; ri++; } } if (ri >= r.length) { while (li < l.length) { a[i] = l[li]; li++; i++; } } } } return a; } }
这是您的代码的更正版本:
import java.io.*; import java.util.Arrays; public class MergeSort { public static void main(String[] args) throws IOException{ BufferedReader R = new BufferedReader(new InputStreamReader(System.in)); int arraySize = Integer.parseInt(R.readLine()); int[] inputArray = new int[arraySize]; for (int i = 0; i < arraySize; i++) { inputArray[i] = Integer.parseInt(R.readLine()); } mergeSort(inputArray); for (int j = 0; j < inputArray.length; j++) { System.out.println(inputArray[j]); } } static void mergeSort(int[] A) { if (A.length > 1) { int q = A.length/2; //changed range of leftArray from 0-to-q to 0-to-(q-1) int[] leftArray = Arrays.copyOfRange(A, 0, q-1); //changed range of rightArray from q-to-A.length to q-to-(A.length-1) int[] rightArray = Arrays.copyOfRange(A,q,A.length-1); mergeSort(leftArray); mergeSort(rightArray); merge(A,leftArray,rightArray); } } static void merge(int[] a, int[] l, int[] r) { int totElem = l.length + r.length; //int[] a = new int[totElem]; int i,li,ri; i = li = ri = 0; while ( i < totElem) { if ((li < l.length) && (ri<r.length)) { if (l[li] < r[ri]) { a[i] = l[li]; i++; li++; } else { a[i] = r[ri]; i++; ri++; } } else { if (li >= l.length) { while (ri < r.length) { a[i] = r[ri]; i++; ri++; } } if (ri >= r.length) { while (li < l.length) { a[i] = l[li]; li++; i++; } } } } //return a; } }