我目前正在尝试为java中的节点编写选择排序。 我还编写了一个完美的冒泡排序,但由于某种原因,选择排序不起作用。我是java的新手,请原谅我找不到错误。
我的选择排序实际上排序了一切。结果很好。但执行不是选择排序应该如何工作。
首先,我切换了节点而不是值,它工作但不是应该的。所以我提出了将节点留在原地的解决方案,然后只需切换值。
public void selectionSort() {
for (IntegerNode i = first; i != null; i = i.nextNode) {
for (IntegerNode j = i.nextNode; j != null; j = j.nextNode) {
if (i.value > j.value) {
int temp = i.value;
i.value = j.value;
j.value = temp;
}
}
}
}
所以它第一次真正做它应该做的事情。它改变了地方。但之后它需要最小的int并将它放在更大的int之前,而不是切换它。我将向您展示一个示例输出
未排序:
2, 9, 7, 6, 3, 1, 5, 8,
开始排序:
1, 9, 7, 6, 3, 2, 5, 8,
1, 2, 9, 7, 6, 3, 5, 8,
1, 2, 3, 9, 7, 6, 5, 8,
1, 2, 3, 5, 9, 7, 6, 8,
1, 2, 3, 5, 6, 9, 7, 8,
1, 2, 3, 5, 6, 7, 9, 8,
1, 2, 3, 5, 6, 7, 8, 9,
排序:
1, 2, 3, 5, 6, 7, 8, 9,
//你可以在第1行看到 - 它用5切换2,这正是选择排序应该做的。 //第二行+ - 它只需要小的整数并将其置于更大的整数之前。
这是我的第一个问题,我希望我提供了足够的代码。如果您需要更多,只需添加评论!提前谢谢。
答案 0 :(得分:0)
您应该尝试使用算法遍历数据集。
基本上你看到的问题是,如果j小于我当前的值,i的值将始终与下一个元素j交换。
所以在第1行开始排序(i = 1,j = 2):
9> 7 - >交换这些:1, 9 , 7 ,6,3,2,5,8, - > 1, 7 , 9 ,6,3,2,5,8,
7> 6 - >交换这些:1, 7 ,9, 6 ,3,2,5,8, - > 1, 6 ,9, 7 ,3,2,5,8
6> 3 - >交换这些:1, 6 ,9,7, 3 ,2,5,8 - > 1, 3 ,9,7, 6 ,2,5,8
3> 2 - >交换这些:1, 3 ,9,7,6, 2 ,5,8 - > 1, 2 ,9,7,6, 3 ,5,8
不再交换,增加i。
相反,只有在找到最小的项目时才尝试将算法更新为交换。
答案 1 :(得分:0)
我使用了选择排序错误。一个基本的错误..对于那些好奇的看起来如何正确:
public void selectionSort() {
for( IntegerNode i = first; i != null; i = i.nextNode){
IntegerNode smallestElement = i;
for ( IntegerNode j = i.nextNode; j != null; j = j.nextNode){
if(smallestElement.value > j.value){
smallestElement = j;
}
}
int temp = i.value;
i.value = smallestElement.value;
smallestElement.value = temp;
}
}