【问题标题】:Sorting array - Can anyone help me where I'm failing?排序数组 - 任何人都可以帮我解决我失败的地方吗?
【发布时间】:2020-08-01 07:27:58
【问题描述】:

我需要组织一个数组,但出现 OutOfBoundException 错误:

int[] A = {8, 6, 7, 9, 4, 8, 1, 4, 10, 3};
int start = 0;
int end = A.length;
public void insertionSort(int[] A, int start, int end) {
  for (int i = start; i <= end; i++){
    for (int j = i+1; j > start; j--){
      if(A[j] < A[j-1]){
        int k = j-1;
        swap(A, j, k);

那个交换函数是别人已经做过的方法,他是教授,所以错误不是来自那里。谁能指出我失败的地方?

【问题讨论】:

  • 您必须提供更多信息。交换是抛出错误还是 if-case?如果交换导致问题,请检查实现或询问编写它的人。如果是 if 情况,那么你的 start 或 end 变量是错误的。
  • 看起来像一个错误,我没有真正考虑过,但你确定“i
  • 我认为在第二个循环中应该是j=i 而不是j=i+1
  • 谢谢Phillipp,我改了还是不行。
  • 我认为您需要做出 Philipp 和 dan 建议的更改之一。我的猜测是你没有大量的调试经验,而这就是这个作业可能应该帮助你的。在其中添加一些System.out.println(...) 语句,您可能会看到问题所在。如果您需要更多帮助,请直接给我发消息,我会尽力引导您完成。

标签: java arrays indexoutofboundsexception


【解决方案1】:

数组从索引 0 而不是 1 开始。因此,数组的长度已经超出了索引的范围。只需更改您的第一个 for 循环,只要i&lt;end 可以解决您的问题,它就会运行。

for (int i = start; i < end; i++)

除此之外,您的内部循环也是错误的。您可以选择是要测试下一个索引 (i+1) 还是上一个索引 (i-1)。在 (i+1) 的情况下,外部循环再次运行得太远(现在它必须是i &lt; end-1)。如果你想用之前的索引(i-1)改变,你的 i 必须从 1 而不是 0 开始。

例如(与下一个元素交换):

for (int i = 0; i < end-1; i++){
    for (int j = i+1; j > 0; j--){
        if(A[j] < A[j-1]){

【讨论】:

  • 这是你的意思吗? for (int i = start+1; i
  • 不,现在你混合了两种方法。我添加了代码以使其清晰。
  • 非常感谢!我感谢您的帮助。我会提交它,希望它是固定的。
  • 仍然失败..我会再问我的教授,但他希望我自己解决:(
  • 它仍然没有对你的数组进行排序。但这可能是另一个问题。如果它修复了您的错误,请将答案标记为正确(并投票)。
【解决方案2】:

你遇到的问题从下面这行开始:

for (int i = start; i <= end; i++)

原因从下一行代码就很明显了:

for (int j = i+1; j > start; j--)

在这一行中,您将使用i + 1 初始化j,然后在下一行尝试访问A[j]

i 将等于end(因为您已将终止条件写为i &lt;= end),j 将等于end + 1 即在您的数组的情况下,j 将等于10 + 1 = 11。但是,A[] 中的最后一个索引是9,因为您必须已经知道数组的索引从0 开始。每当您尝试从最后一个索引之外的索引访问数组的元素时,都会抛出 ArrayIndexOutOfBoundsException

以下是更正后的代码:

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        int[] A = { 8, 6, 7, 9, 4, 8, 1, 4, 10, 3 };
        int start = 0;
        int end = A.length;
        insertionSort(A, start, end);
        System.out.println(Arrays.toString(A));
    }

    static void insertionSort(int[] A, int start, int end) {
        for (int i = start; i < end - 1; i++) {
            for (int j = i + 1; j > start; j--) {
                if (A[j] < A[j - 1]) {
                    int k = j - 1;
                    swap(A, j, k);
                }
            }
        }
    }

    static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

输出:

[1, 3, 4, 4, 6, 7, 8, 8, 9, 10]

【讨论】:

    【解决方案3】:

    你真的很亲近,在我看来你只犯了一个错误。

    这是您的代码。

    public void insertionSort(int[] A, int start, int end) {
       for (int j = i+1; j > start; j--){
          if(A[j] < A[j-1]){
             int k = j-1;
             swap(A, j, k);
           }
       }
    }
    
    

    问题在于外部 for 循环。

    改成

    for (int i = start; i <= end; i++)
    

    for (int i = start; i < end-1; i++)
    

    原因如下:

    • i &lt;= end 将包含 end 值,但由于数组基于 0,您将超出数组大小。
    • 此外,由于内部循环将1 添加到i,您需要执行end-1,这样i 也不会超过数组大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      相关资源
      最近更新 更多