合并排序 java 错误(学习 edX.org
merge sort java error (learning from edX.org
这是我要归并排序的数组,位于static void main:
int[] lst = {6, 5, 4, 7, 2, 1, 9}
这是 mergeSort
函数:
static int[] mergeSort(int[] lst) {
int n = lst.length;
int[] left;
int[] right;
// create space for left and right subarrays
if (n % 2 == 0) {
left = new int[n/2];
right = new int[n/2];
}
else {
left = new int[n/2];
right = new int[n/2+1];
}
// fill up left and right subarrays
for (int i = 0; i < n; i++) {
if (i < n/2) {
left[i] = lst[i];
}
else {
right[i-n/2] = lst[i];
}
}
// **ERROR B**
// recursively split and merge
left = mergeSort(left);
right = mergeSort(right);
// merge
return merge(left, right);
}
这里是 merge
函数:
// the function for merging two sorted arrays
static int[] merge(int[] left, int[] right) {
// create space for the merged array
int[] result = new int[left.length+right.length];
// running indices
int i = 0;
int j = 0;
int index = 0;
// add until one subarray is deplete
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
result[index++] = left[i++];
{ // **ERROR A** [ see description below ]
else {
result[index++] = right[j++];
}
}
// add every leftover elelment from the subarray
while (i < left.length) {
result[index++] = left[i++];
}
// only one of these two while loops will be executed
while (j < right.length) {
result[index++] = right[j++];
}
return result;
}
错误 A:我在这里收到一个错误,说没有 if 的 else 语句。如果我删除 result[index++] = left[i++]
下的大括号,它将 运行 并给我一个错误: Exception in thread "main" java.lang.WhosebugError
并将错误指向上面的代码,即 ERROR B.
您的 mergeSort() 方法缺少一个条件。如果你的列表只有 1 的长度,你必须停止尝试进一步拆分它并且 return 它合并。
这非常接近。您所缺少的只是合并排序中的递归 base case ,正如所写的那样,它将无休止地递归,直到堆栈崩溃。它说:“0 或 1 项列表?继续拆分!”
归并排序的关键实现是单元素数组或零元素数组已经排序。这是基本情况。编码如下:
if (n <= 1) {
return lst; // this list is already sorted
}
至于你的其他错误,那只是一个不匹配的括号并修复它 应该 给你堆栈溢出错误,这是你的主要问题并且与括号问题无关。这是完整的工作代码:
class Main {
public static void main(String[] args) {
int[] lst = {6, 5, 4, 7, 2, 1, 9};
System.out.println(java.util.Arrays.toString(mergeSort(lst)));
}
static int[] mergeSort(int[] lst) {
int n = lst.length;
if (n <= 1) {
return lst;
}
int[] left;
int[] right;
if (n % 2 == 0) {
left = new int[n/2];
right = new int[n/2];
}
else {
left = new int[n/2];
right = new int[n/2+1];
}
for (int i = 0; i < n; i++) {
if (i < n / 2) {
left[i] = lst[i];
}
else {
right[i-n/2] = lst[i];
}
}
left = mergeSort(left);
right = mergeSort(right);
return merge(left, right);
}
static int[] merge(int[] left, int[] right) {
int[] result = new int[left.length+right.length];
int index = 0;
int i = 0;
int j = 0;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
result[index++] = left[i++];
}
else {
result[index++] = right[j++];
}
}
while (i < left.length) {
result[index++] = left[i++];
}
while (j < right.length) {
result[index++] = right[j++];
}
return result;
}
}
这是我要归并排序的数组,位于static void main:
int[] lst = {6, 5, 4, 7, 2, 1, 9}
这是 mergeSort
函数:
static int[] mergeSort(int[] lst) {
int n = lst.length;
int[] left;
int[] right;
// create space for left and right subarrays
if (n % 2 == 0) {
left = new int[n/2];
right = new int[n/2];
}
else {
left = new int[n/2];
right = new int[n/2+1];
}
// fill up left and right subarrays
for (int i = 0; i < n; i++) {
if (i < n/2) {
left[i] = lst[i];
}
else {
right[i-n/2] = lst[i];
}
}
// **ERROR B**
// recursively split and merge
left = mergeSort(left);
right = mergeSort(right);
// merge
return merge(left, right);
}
这里是 merge
函数:
// the function for merging two sorted arrays
static int[] merge(int[] left, int[] right) {
// create space for the merged array
int[] result = new int[left.length+right.length];
// running indices
int i = 0;
int j = 0;
int index = 0;
// add until one subarray is deplete
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
result[index++] = left[i++];
{ // **ERROR A** [ see description below ]
else {
result[index++] = right[j++];
}
}
// add every leftover elelment from the subarray
while (i < left.length) {
result[index++] = left[i++];
}
// only one of these two while loops will be executed
while (j < right.length) {
result[index++] = right[j++];
}
return result;
}
错误 A:我在这里收到一个错误,说没有 if 的 else 语句。如果我删除 result[index++] = left[i++]
下的大括号,它将 运行 并给我一个错误: Exception in thread "main" java.lang.WhosebugError
并将错误指向上面的代码,即 ERROR B.
您的 mergeSort() 方法缺少一个条件。如果你的列表只有 1 的长度,你必须停止尝试进一步拆分它并且 return 它合并。
这非常接近。您所缺少的只是合并排序中的递归 base case ,正如所写的那样,它将无休止地递归,直到堆栈崩溃。它说:“0 或 1 项列表?继续拆分!”
归并排序的关键实现是单元素数组或零元素数组已经排序。这是基本情况。编码如下:
if (n <= 1) {
return lst; // this list is already sorted
}
至于你的其他错误,那只是一个不匹配的括号并修复它 应该 给你堆栈溢出错误,这是你的主要问题并且与括号问题无关。这是完整的工作代码:
class Main {
public static void main(String[] args) {
int[] lst = {6, 5, 4, 7, 2, 1, 9};
System.out.println(java.util.Arrays.toString(mergeSort(lst)));
}
static int[] mergeSort(int[] lst) {
int n = lst.length;
if (n <= 1) {
return lst;
}
int[] left;
int[] right;
if (n % 2 == 0) {
left = new int[n/2];
right = new int[n/2];
}
else {
left = new int[n/2];
right = new int[n/2+1];
}
for (int i = 0; i < n; i++) {
if (i < n / 2) {
left[i] = lst[i];
}
else {
right[i-n/2] = lst[i];
}
}
left = mergeSort(left);
right = mergeSort(right);
return merge(left, right);
}
static int[] merge(int[] left, int[] right) {
int[] result = new int[left.length+right.length];
int index = 0;
int i = 0;
int j = 0;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
result[index++] = left[i++];
}
else {
result[index++] = right[j++];
}
}
while (i < left.length) {
result[index++] = left[i++];
}
while (j < right.length) {
result[index++] = right[j++];
}
return result;
}
}