java - 我的合并排序程序在 Java 中显示了一个超出范围的数组
问题描述
我正在学习 Java,我制作了这个合并排序程序,但它抛出了ArrayOutOfBound
. 我的错误是什么?
我也在array.length
或使用此代码,array.length-1
但两种情况都失败了。看来我的代码不接受数组的长度。
// 分割数组---
void divide(int a[], int lb, int ub) {
if (lb < ub) {
int mid = (lb + ub) / 2;
divide(a, lb, mid);
divide(a, mid + 1, ub);
merge(a, lb, mid, ub);
}
}
//用于打印实际数组---
static void ActualArray(int a[]) {
System.out.println("----!!!Merge Sort!!!----");
System.out.println("Your Array is: ");
for (int i : a) {
System.out.print(i + " ");
}
System.out.println("\n");
}
//用于合并数组
void merge(int a[], int lb, int mid, int ub) {
int i = lb;
int j = mid + 1;
int k = lb;
int b[] = {};
while (i <= mid && j <= ub) {
if (a[i] < a[j]) {
b[k] = a[i];
i++;
} else {
b[k] = a[j];
j++;
}
k++;
}
if (i > mid) {
while (j <= ub) {
b[k] = a[j];
j++;
k++;
}
} else {
while (i <= mid) {
b[k] = a[i];
i++;
k++;
}
}
System.out.println("Your Sorted Array is: ");
for (int ele : b) {
System.out.print(ele + " ");
}
}
// 主要方法
public static void main(String args[]) {
int arr[] = { 25, 16, 45, 17, 84, 61 };
ActualArray(arr);
MergeSort obj = new MergeSort();
obj.divide(arr, 0, arr.length - 1);
}
解决方案
您的方法存在多个问题merge
:
- 您不分配临时数组
b
。你应该写int b[] = new int[ub - lb + 1];
- 临时数组的索引
k
应初始化为0
,而不是lb
。 - 您应该将临时数组的内容复制回
a
. - 打印排序切片仅用于调试。
这是修改后的版本:
void merge(int a[], int lb, int mid, int ub) {
int b[] = new int[ub - lb + 1];
int i = lb;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= ub) {
if (a[i] < a[j]) {
b[k++] = a[i++];
} else {
b[k++] = a[j++];
}
}
// copy the remaining elements from the left part
while (i <= mid) {
b[k++] = a[i++];
}
// the remaining elements from the right part are already in the proper place
// copy back the sorted slice into the original array
for (i = 0; i < k; i++) {
a[lb + i] = b[i];
}
}
推荐阅读
- javascript - javascript中的replace方法是否不适用于变量?
- python - LogRecord格式的最后一个字母是什么
- java - 显示最小到最大库存数组 (Java) 的错误
- laravel - laravel 一对多关系为空
- excel - 如何在 SQL 连接字符串中给出单元格引用
- html - 调整 chrome 浏览器窗口的大小
- python - 'tanh' 激活函数有一个奇怪的输出
- sql - SQL:使用所有可能的组合进行更新
- sql - Oracle FETCH FIRST 1 ROW 与 UNION ALL 语句
- python - 保存没有背景opencv的图像