为什么归并排序中的条件语句会抛出错误?

问题描述 投票:0回答:1

我练习用java编写关于合并排序算法的代码。乍一看似乎不错,但“if”条件中有几个问题。

在我的代码中,首先我迭代原始数组以合并两个不同的子数组。所以我设一个条件,只要“i”小于或大于等于mid,Arr[low + i],即Arr中的原数组,就被赋值给arr_left [我]。当我运行代码时,出现索引越界的错误。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
    at baseproj/basetest.MergeSort.merge(MergeSort.java:24)
    at baseproj/basetest.MergeSort.main(MergeSort.java:12)

我只是java初学者。因此,如果任何前辈能够解释为什么这是错误以及我如何解决它,我将非常感激。

以下是我的代码。然而,这并不是绝对完整的代码,它只是一段代码。

package sorting_algorithm;

import java.util.Arrays;

public class MergeSort {

    public static void main(String[] args) {
        int[] arr = {38, 27, 43, 10, 56, 27, 18, 32};
        int low = 0;
        int high = arr.length - 1;
        int mid = high / 2;
        merge(arr, low, mid, high);
    }

    public static void merge(int[] Arr, int low, int mid, int high) {
        int[] arr_left = new int[mid - low + 1];
        int[] arr_right = new int[high - mid];
        for (int i = 0; i < Arr.length; i++) {
            if (i <= mid) {
                arr_left[i] = Arr[low + i];
            }
            else {
                System.out.printf("i = %d , mid = %d%n", i, mid);
                arr_right[i] = Arr[mid + 1 + i];
            }
        }
        System.out.println(Arrays.toString(arr_left));
        System.out.println(Arrays.toString(arr_right));
    }
}

由于合并排序算法的本质,我试图通过让原始数组迭代并使用 if 条件正确分配给左数组和右数组,将原始数组划分为两个不同的子数组。

java arrays mergesort
1个回答
0
投票

您可以使用调试工具调试您的代码,例如,这个在线工具https://www.onlinegdb.com/online_java_debugger,然后您将看到下面的异常,这意味着“

arr_right[i] = Arr[mid + 1 + i];
”引发了异常,因为此处
mid + 1 + i
等于 8

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:索引 8 超出长度 8 的范围 在 Main.merge(Main.java:32) 在 Main.main(Main.java:18)

© www.soinside.com 2019 - 2024. All rights reserved.