我目前正在尝试为java中的节点编写选择排序 . 我还编写了一个完美的冒泡排序,但由于某种原因,选择排序不起作用 . 我是java的新手,请原谅我找不到错误 .
我的选择排序实际上排序了一切 . 结果很好 . 但执行不是选择排序应该如何工作 .
首先,我切换了节点而不是值,它工作但不是应该的 . 所以我提出了将Node留在原地的解决方案,然后切换值 .
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,这正是选择排序应该做的 . //第二行 - 它只需要小的整数并将其置于更大的整数之前 .
这是我的第一个问题,我希望我提供了足够的代码 . 如果您需要更多,只需添加评论!提前致谢 .
2 回答
我使用了选择排序错误 . 一个基本错误..对于那些好奇的看起来如何正确:
您应该尝试使用算法遍历数据集 .
基本上你看到的问题是,如果j小于i的当前值,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
没有互换,增加我 .
相反,只有在找到最小的项目时才尝试将算法更新为交换 .