【问题标题】:Why does my insertion sort algorithm only work with single digit integers?为什么我的插入排序算法只适用于个位数整数?
【发布时间】:2016-03-06 18:06:06
【问题描述】:

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

注意:只是为了让你理解源代码,我的程序的工作方式是这样的:我在构造中将InsertionSort 类传递给原始int 数组。然后我将其转换为ArrayList list。我知道 ArrayList list 复制了正确的值,因为我将其打印出来并且匹配。

示例运行:

工作:

{ 9, 2, 8, 5, 1, 6, 6, 7, 1}; //works perfectly->

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]

不工作:

{ 9, 2, 8, 5, 1, 6, 6, 7, 1, 22, 823, 30, 244, 45, 5}; //doesn't work->

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()]));
}

【问题讨论】:

  • 听起来你应该做一些调试......
  • @OliverCharlesworth 我尝试添加一些打印语句和东西。我还阅读了有关 ArrayList 的 JavaDoc。老实说,我真的不知道如何使用eclipse调试器。你能推荐一个调试程序吗? (在哪里添加打印语句等)
  • 学习使用调试器与学习语言一样重要。花一些时间在上面。 tutorialspoint.com/eclipse/eclipse_debugging_program.htm
  • @OldProgrammer 好的,谢谢您的链接和建议。你是 100% 正确的,我一定会学习调试器。我一直想这样做有一段时间了,只是从来没有真正需要它,因为我的大多数程序都非常简单。

标签: java arrays algorithm sorting arraylist


【解决方案1】:

它与单个或多个数字无关,在第一个示例中,您很幸运将最大的数字作为列表中的第一个元素。当您为下一个元素选择位置时,有一个明显的错误:

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

您增加索引但不进行边界检查,因此当涉及到数字 22 时,您会遇到异常。正确的应该是

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

【讨论】:

  • 谢谢亚当,我会把那一点添加到循环中。比我的解决方案更好:if(z &gt;= list2.size()) { z--; break; }
【解决方案2】:

心灵调试。问题就在这里:

while (list2.get(z) < list.get(i)) {
                    z++;
                }

如果新值最大,则 z 超过 list2 计数。
小数示例中的第一个值 9 隐藏了此问题。

我希望解决方案足够清晰

【讨论】:

  • 谢谢!现在工作(几乎,发现了另一个问题,但我想我可以处理)。
猜你喜欢
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多