我是一个新的编码,我试图在java中创建合并排序算法。我得到太多的错误,我不能找出确切的错误代码。我觉得我的逻辑是正确的,但不知道哪一步是导致错误的。有人能帮我纠正下面代码中的错误吗。谢谢您
package com.company;
public class MergeSort_Array {
//Method created to print Input Array
public static void printInputArray(int inputArray[]) {
for (int i:inputArray) { //for-each loop
System.out.print(i + " ");
}
System.out.println();
}
//Function created to sort and merge Input Array:
public static void SortArray(int[] A) {
int midpoint = A.length / 2;
int[] left = new int[midpoint];
int[] right;
if (A.length % 2 == 0) {
right = new int[midpoint];
} else {
right = new int[midpoint + 1];
}
//Copying values from super Array to left Array:
for (int i = 0; i < midpoint; i++) {
left[i] = A[i];
}
//Copying elements from super Array to right Array:
for (int j = 0; j < right.length; j++) {
right[j] = A[midpoint + j];
}
//using Recursion
SortArray(left);
SortArray(right);
MergeArray(A, left, right);
}
// Creating a Function to merge left and right arrays.
public static void MergeArray(int[] result, int[] L, int[] R) {
//result array length = length of left array+ right array length
result = new int[L.length + R.length];
int i = 0, j = 0, k = 0;
while (k < result.length) {
if (L[i] < R[j]) {
result[k] = L[i];
i++;
} else
if (R[j] < L[i]) {
result[k] = R[j];
j++;
} else
if (i > L.length) {
while (j <= R.length) {
result[k] = R[j];
j++;
}
} else
if (j > R.length && i <= L.length) {
while (i <= L.length) {
result[k] = L[i];
i++;
}
}
k++;
}
}
public static void main(String[] args) {
int[] inputArray = { 2, 5, 4, 1, 7, 9, 6 };
MergeSort_Array ms = new MergeSort_Array();
ms.printInputArray(inputArray);
SortArray(inputArray);
for (int i: inputArray) {
System.out.println(i + " ");
}
}
}
2条答案
按热度按时间jqjz2hbq1#
每次你打电话
SortArray
它将自己召唤SortArray
两次。没有终止条件:每次调用都将尝试调用SortArray
两次。这意味着
SortArray
可以完成,因为你在它们中无限地递归。一定有一些基本情况下,它不再称自己。对于mergesort,一旦数组足够小,通常会切换到其他算法,但为了简单起见,您甚至可以退回到最简单的基本情况进行排序:任何小于2个元素的数组都会被排序,并且不需要做任何其他事情来排序。
sg3maiej2#
代码中存在多个问题:
[专业]
SortArray()
总是尝试拆分数组并对两半进行排序。如果数组长度小于2,则不应执行此操作,否则会出现无限递归,从而导致堆栈溢出异常。[提示]
right
可以无条件初始化为int[] right = new int[A.length - midpoint];
[专业]MergeArray
不应重新分配目标阵列。合并必须就地执行到result
所以调用者的对象被更新。[major]在合并循环中,您必须在尝试读取之前测试索引值
L[i]
或者R[j]
,否则可能会出现越界异常。以下是一个修改版本: