我的SelectionSort方法不起作用。为什么?

时间:2011-04-29 06:07:17

标签: java sorting selection linked-list

我正在尝试在我自己编写的双链表的版本中使用选择排序算法。对于这个问题,我们可以假设除了我发布的代码之外没有其他地方的错误(至少与问题无关)。我做了很多测试。

这是我的方法:

public void selectionSort(){

    ListItem front = head;
    ListItem current;
    T currentLowest;
    T potentialLowest;
    int lowestIndex = 0;
    for (int a = 0; a<count-1; a++){
        System.out.println("a: "+a);
        currentLowest = (T) front.content;
        front = front.next;
        current = front.next;
    for(int i = a+1; i<count; i++){
        System.out.println("i: "+i);
**(29)**    potentialLowest = (T) current.content;
        if (potentialLowest.compareTo(currentLowest)==-1)
        {
            currentLowest = (T) current.content;
            lowestIndex = i;
        }
        if(current.next == null)break;

        current = current.next;
    }
    System.out.println("swapped"+a+","+lowestIndex);
    swap(a, lowestIndex);
}

}

它正在排序100个整数的列表。这是在第29行(标记为)上收到空指针之前的最后一位输出。

swapped95,97

a:96 我:97 我:98

swapped96,97

a:97 我:98

swapped97,97

a:98 我:99 (空指针)

我之前有过这项工作,但它非常优化。做了一些改变后,我坚持这个。有什么想法吗?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

您正在尝试访问null元素的内容。当你在最后一个元素上时,当你将它设置为下一个时,你的“当前”将为空。

我觉得我有点太累了,不能为它提供修复,但你应该能够将旧的(工作)代码与它进行比较并发现修复。

答案 1 :(得分:0)

我认为问题可能出现在排序循环的第一次迭代中。考虑到此函数中的第一行(ListItem front = head)将front指向列表的第一个元素,似乎通过调用:front = front.next; current = front.next; 实际上“跳过”索引1处的元素在列表中,并在索引2处开始元素的比较循环。

例如,如果您的(未排序的)列表如下所示:

[54, 11, 25, 34]

看起来像

[25, 11, 54, 34]

在排序算法的第一次迭代之后。由于下一次迭代将从索引1开始,因此元素11永远不会放在索引0,即使它是列表中的最低元素。

可能是这种不准确导致列表末尾的空指针问题。我会考虑将语句front = front.next; 放在内部for循环之后,将放在 swap(a, lowestIndex);语句之前。这将防止第一次迭代中可能出现的错误,并可能解决您的问题。