我正在尝试在我自己编写的双链表的版本中使用选择排序算法。对于这个问题,我们可以假设除了我发布的代码之外没有其他地方的错误(至少与问题无关)。我做了很多测试。
这是我的方法:
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 (空指针)
我之前有过这项工作,但它非常优化。做了一些改变后,我坚持这个。有什么想法吗?
感谢您的时间。
答案 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);
语句之前。这将防止第一次迭代中可能出现的错误,并可能解决您的问题。