Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的插入排序没有通过这个测试用例?_Java_Sorting_Indexoutofboundsexception_Insertion Sort - Fatal编程技术网

Java 为什么我的插入排序没有通过这个测试用例?

Java 为什么我的插入排序没有通过这个测试用例?,java,sorting,indexoutofboundsexception,insertion-sort,Java,Sorting,Indexoutofboundsexception,Insertion Sort,我正在尝试编写一个插入排序,我通过了几个测试用例,但有一个失败了。我的代码是: static void insertionSort1(int n, int[] arr) { int copy = arr[n-1]; int i = n - 1; while (copy < arr[i-1]){ arr[i] = arr[i-1]; for(int k = 0; k < arr.length; k++){

我正在尝试编写一个插入排序,我通过了几个测试用例,但有一个失败了。我的代码是:

static void insertionSort1(int n, int[] arr) {


    int copy = arr[n-1];

    int i = n - 1;
    while (copy < arr[i-1]){

        arr[i] = arr[i-1];

        for(int k = 0; k < arr.length; k++){
            System.out.print(arr[k] + " ");
        }
            System.out.println();
        i--;
        }
     arr[i] = copy;
    for(int m = 0; m < arr.length; m++){
       System.out.print(arr[m] + " ");
     }
    }
我得到的索引超出了这个范围,但不是这个范围

5

2 4 6 8 3

或者其他。发生了什么事?

首先,您应该回顾什么是插入排序。您应该在数组的一端构建一个排序列表,通过在正确的位置“插入”下一个值,一次扩展一个元素。如果一次给你一张牌,这应该很像是给一手牌排序。您将需要一个嵌套的循环来正确执行它


仔细考虑你的程序真正在做什么,看看它为什么失败了——以同样的方式失败的较短的测试用例将是<代码> [3, 2, 1 ] < /代码>。或者,就这一点而言,

[2,1]

这是数组的索引越界异常,因为arr值为负值。这不是算法问题,而是语言问题

while (i > 0 && copy < arr[i - 1])

祝您愉快。

@AviG告诉某人学习如何调试听起来有点粗鲁,但这是您在整个编程过程中收到的最好的建议。因此,如果
n
是数组的长度,为什么不将其作为参数删除,然后在方法中插入这一行:
int n=arr.length
这将消除有人为
n
@GBlodgett bc输入错误长度的可能性这就是我所面临的挑战,即方法的参数必须是什么?确切的异常消息是什么
ArrayIndexOutOfBoundsException
具有索引。如果它是负数,我不会感到惊讶,因为我在代码中没有看到对
I
进行任何边界检查。是的,它是一个带-1的超出边界的索引。但是我已经测试了几个输入,这个算法做了它应该做的事情。我正在接受挑战的网站希望它能正常工作,然后它的下一个挑战是完成插入排序。这就是为什么我想让它通过这个测试。
while (i > 0 && copy < arr[i - 1])
public class InsertionSort {
    static void insertionSort1(int n, int[] arr) {

        int copy = arr[n - 1];

        int i = n - 1;
        while (i > 0 && copy < arr[i - 1]) {

            arr[i] = arr[i - 1];

            for (int k = 0; k < arr.length; k++) {
                System.out.print(arr[k] + " ");
            }
            System.out.println();
            i--;
        }
        arr[i] = copy;
        System.out.println("#### RESULT ####");
        for (int m = 0; m < arr.length; m++) {
            System.out.print(arr[m] + " ");
        }
        System.out.println("\n#### END ####\n");
    }

    public static void main(String[] args)
    {
        //10
        //2 3 4 5 6 7 8 9 10 1
        int[] arr ={2, 3, 4, 5, 6, 7, 8, 9, 10, 1};
        int n = arr.length;
        insertionSort1(n, arr);


        //5
        //2 4 6 8 3
        arr= new int[5];
        n = arr.length;

        arr[0] = 2;
        arr[1] = 4;
        arr[2] = 6;
        arr[3] = 8;
        arr[4] = 3;

        insertionSort1(n, arr);
    }
}
2 3 4 5 6 7 8 9 10 10 
2 3 4 5 6 7 8 9 9 10 
2 3 4 5 6 7 8 8 9 10 
2 3 4 5 6 7 7 8 9 10 
2 3 4 5 6 6 7 8 9 10 
2 3 4 5 5 6 7 8 9 10 
2 3 4 4 5 6 7 8 9 10 
2 3 3 4 5 6 7 8 9 10 
2 2 3 4 5 6 7 8 9 10 
#### RESULT ####
1 2 3 4 5 6 7 8 9 10 
#### END ####

2 4 6 8 8 
2 4 6 6 8 
2 4 4 6 8 
#### RESULT ####
2 3 4 6 8 
#### END ####