Java 为什么我的插入排序算法只适用于一位数整数?

Java 为什么我的插入排序算法只适用于一位数整数?,java,arrays,algorithm,sorting,arraylist,Java,Arrays,Algorithm,Sorting,Arraylist,为了好玩,我写了一个简单的插入排序算法。它似乎可以很好地解决一个问题,只有当数组中的所有项(它试图排序的对象)都是一位数整数时,它才能工作。如果一个元素是一个多位数的整数,它会将所有内容排序到该整数,然后停止并抛出一个IndexOutOfBoundsException。 注意:为了让您理解源代码,我的程序的工作方式如下:我在构造中传递InsertionSortclass a primativeint数组。然后我将其转换为ArrayList列表。我知道,ArrayList列表复制了正确的值,因为我

为了好玩,我写了一个简单的插入排序算法。它似乎可以很好地解决一个问题,只有当数组中的所有项(它试图排序的对象)都是一位数整数时,它才能工作。如果一个元素是一个多位数的整数,它会将所有内容排序到该整数,然后停止并抛出一个
IndexOutOfBoundsException。

注意:为了让您理解源代码,我的程序的工作方式如下:我在构造中传递
InsertionSort
class a primative
int
数组。然后我将其转换为
ArrayList列表
。我知道,
ArrayList列表
复制了正确的值,因为我将其打印出来并匹配

示例运行:

工作:

{9,2,8,5,1,6,6,7,1}//工作正常
->

Unsorted List: [9, 2, 8, 5, 1, 6, 6, 7, 1]
Step 1: [9]
Step 2: [2, 9]
Step 3: [2, 8, 9]
Step 4: [2, 5, 8, 9]
Step 5: [1, 2, 5, 8, 9]
Step 6: [1, 2, 5, 6, 8, 9]
Step 7: [1, 2, 5, 6, 6, 8, 9]
Step 8: [1, 2, 5, 6, 6, 7, 8, 9]
Step 9: [1, 1, 2, 5, 6, 6, 7, 8, 9]
Sorted List: [1, 1, 2, 5, 6, 6, 7, 8, 9]
Unsorted List: [9, 2, 8, 5, 1, 6, 6, 7, 1, 22, 823, 30, 244, 45, 5]
Step 1: [9]
Step 2: [2, 9]
Step 3: [2, 8, 9]
Step 4: [2, 5, 8, 9]
Step 5: [1, 2, 5, 8, 9]
Step 6: [1, 2, 5, 6, 8, 9]
Step 7: [1, 2, 5, 6, 6, 8, 9]
Step 8: [1, 2, 5, 6, 6, 7, 8, 9]
Step 9: [1, 1, 2, 5, 6, 6, 7, 8, 9]
java.lang.IndexOutOfBoundsException: Index: 9, Size: 9
Sorted List: [1, 1, 2, 5, 6, 6, 7, 8, 9]
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at InsertionSort.sort(InsertionSort.java:41)
    at Executer.main(Executer.java:7)
不工作:

{9,2,8,5,1,6,6,7,1,22,823,30,244,45,5}//不工作
->

Unsorted List: [9, 2, 8, 5, 1, 6, 6, 7, 1]
Step 1: [9]
Step 2: [2, 9]
Step 3: [2, 8, 9]
Step 4: [2, 5, 8, 9]
Step 5: [1, 2, 5, 8, 9]
Step 6: [1, 2, 5, 6, 8, 9]
Step 7: [1, 2, 5, 6, 6, 8, 9]
Step 8: [1, 2, 5, 6, 6, 7, 8, 9]
Step 9: [1, 1, 2, 5, 6, 6, 7, 8, 9]
Sorted List: [1, 1, 2, 5, 6, 6, 7, 8, 9]
Unsorted List: [9, 2, 8, 5, 1, 6, 6, 7, 1, 22, 823, 30, 244, 45, 5]
Step 1: [9]
Step 2: [2, 9]
Step 3: [2, 8, 9]
Step 4: [2, 5, 8, 9]
Step 5: [1, 2, 5, 8, 9]
Step 6: [1, 2, 5, 6, 8, 9]
Step 7: [1, 2, 5, 6, 6, 8, 9]
Step 8: [1, 2, 5, 6, 6, 7, 8, 9]
Step 9: [1, 1, 2, 5, 6, 6, 7, 8, 9]
java.lang.IndexOutOfBoundsException: Index: 9, Size: 9
Sorted List: [1, 1, 2, 5, 6, 6, 7, 8, 9]
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at InsertionSort.sort(InsertionSort.java:41)
    at Executer.main(Executer.java:7)
这是相关的排序代码:

static ArrayList<Integer> list = new<Integer> ArrayList();
static ArrayList<Integer> list2 = new<Integer> ArrayList();

public static int[] sort() {
    int s = 0;
    System.out.println("Unsorted List: " + list.toString());

    try {
        for (int i = 0; i < list.size(); i++) {
        s++;
            if (i == 0) {
                list2.add(list.get(i));
                System.out.println("Step " + s + ": " + list2.toString());
                continue;

            } else {
                int z = 0;
                while (list2.get(z) < list.get(i)) {
                    z++;
                }

                list2.add(z, list.get(i));

            }
            System.out.println("Step " + s + ": " + list2.toString());
        }

    } catch (Exception e) {
        e.printStackTrace();

    }
    System.out.println("Sorted List: " + list2.toString());

    return toPrimative(list.toArray(new Integer[list.size()]));
}
static ArrayList list=new ArrayList();
静态ArrayList list2=新的ArrayList();
公共静态int[]排序(){
int s=0;
System.out.println(“未排序的列表:+List.toString());
试一试{
对于(int i=0;i
注意调试。问题在于:

while (list2.get(z) < list.get(i)) {
                    z++;
                }
while(list2.get(z)
如果新值最大,则z超过list2计数。
小数值示例中的第一个值9隐藏了此问题


我希望这个解决方案足够清楚,它与一位数或多位数无关,在第一个示例中,您很幸运地将最大的数字作为列表中的第一个元素。在为下一个元素选择位置时,存在一个明显的错误:

int z = 0;
while (list2.get(z) < list.get(i)) {
    z++;
}
intz=0;
while(list2.get(z)
你们增加索引,但不做边界检查,所以当涉及到数字22时,你们会得到一个异常。正确的答案是

while (list2.get(z) < list.get(i) && z <= list2.size())

while(list2.get(z)if(z>=list2.size()){z--;break;}