我的代码有问题,我制作了一个单链表类,您可以在其中添加、删除、修改、合并等。。。然而,我正在尝试一个简单的冒泡排序,并且遇到了列表排序不正确的问题。以下是一些需要注意的事项:
public static void sortList()
{
if (isEmpty() == true)
{
System.out.println("Cannot sort - the html" target="_blank">list is empty");
}
else if (getHead().getNext() == null)
{
System.out.println("List sorted");
}
else
{
Node current = getHead().getNext();
CustomerFile tempDat;
boolean swapDone = true;
while (swapDone)
{
current = getHead().getNext();
swapDone = false;
while (current != null)
{
if (current.getNext() != null &&
current.getData().getSurname().compareTo(
current.getNext().getData().getSurname()) >0)
{
tempDat = current.getData();
current.setData(current.getNext().getData());
current.getNext().setData(tempDat);
swapDone = true;
}
current = current.getNext();
}
}
if (getHead().getData().getSurname().compareTo(
getHead().getNext().getData().getSurname()) >0)
{
current = getHead().getNext();
getHead().setNext(current.getNext());
setHead(current);
}
}
}
我将非常感谢您的反馈
您没有将头部包括在排序中。
public static void sortList()
{
if (isEmpty() == true)
{
System.out.println("Cannot sort - the list is empty");
}
else if (getHead().getNext() == null)
{
System.out.println("List sorted");
}
else
{
Node current = getHead();
// Node current = getHead().getNext();
CustomerFile tempDat;
boolean swapDone = true;
while (swapDone)
{
current = getHead().getNext();
swapDone = false;
while (current != null)
{
if (current.getNext() != null && current.getData().getSurname().compareTo(current.getNext().getData().getSurname()) >0)
{
tempDat = current.getData(); // td -> objectA, cd -> objectA
current.setData(current.getNext().getData()); // cd -> objectB
current.getNext().setData(tempDat); // nd -> td -> objectA
swapDone = true;
}
current = current.getNext();
}
}
//if (getHead().getData().getSurname().compareTo(getHead().getNext().getData().getSurname()) >0)
//{
// current = getHead().getNext(); // current -> head+1
// getHead().setNext(current.getNext()); //head+1 -> head+2
// setHead(current); // head -> head+1
//}
}
}
另外,上面注释掉的代码中也有一个错误。应用该代码会删除一个节点。
// list: a -> b -> c -> d
current = getHead().getNext(); // current = b
getHead().setNext(current.getNext()); // a -> c
setHead(current); // head = b
// list: b -> c -> d
// and nothing points to 'a' anymore
您应该尝试交换节点,而不是交换数据。如果你采用这种方法,你应该找到更好的解决办法。
我认为这里的主要问题是你从
current = getHead().getNext()
有了这段代码,您将把head完全排除在排序过程之外,可能这里的数据需要转到列表的另一端,但在这种情况下,它将始终是head元素中的数据,或者是head节点后面的数据(后者是由于末尾的if语句)。
试着从列表的开头开始,看看会带来什么。
您的代码是一个奇怪的混合体,主要是交换数据,但要特别对待头部,试图通过切换链接来交换数据。
正如在另一个答案中所指出的,最后一次交换没有正确实现,但是如果您通过交换数据来做事情,实际上没有理由特别对待头部。
您所要做的就是从外部循环的头部开始遍历列表。
这产生了一个可行的解决方案:
public void sortList()
{
if (isEmpty())
{
System.out.println("An empty list is already sorted");
}
else if (getHead().getNext() == null)
{
System.out.println("A one-element list is already sorted");
}
else
{
Node current = getHead();
boolean swapDone = true;
while (swapDone)
{
swapDone = false;
while (current != null)
{
if (current.getNext() != null && current.getData().getSurname().compareTo(current.getNext().getData().getSurname()) >0)
{
CustomerFile tempDat = current.getData();
current.setData(current.getNext().getData());
current.getNext().setData(tempDat);
swapDone = true;
}
current = current.getNext();
}
current = getHead();
}
}
}
我把它变成非静态的,因为正如评论中所指出的,我不清楚你的静态是如何工作的。您可以在上下文中使其保持静态。
我还改变了其他一些小事情。不需要像这样的代码来检查条件
if (isEmpty() == true)
在Java中,这完全等同于
if (isEmpty())
并且不需要在使用它的地方之外声明。
问题内容: 我必须在链接列表而不是数组上实现BubbleSort算法。我是Java的新手,所以我真的不知道如何将其放入代码中。但是我尝试了一下,这就是我得到的: SinglyNode.java LinkList.java 我认为我的问题在方法中。我不知道如何实现BubbleSort,以便它将对象名称按升序排序。 SinglyLinkList.java 问题答案: 在您的列表中,有一个size字段将
本文向大家介绍编写Golang程序以使用冒泡排序对数组进行排序,包括了编写Golang程序以使用冒泡排序对数组进行排序的使用技巧和注意事项,需要的朋友参考一下 定义:冒泡排序是最简单的排序算法,通过以错误顺序重复交换相邻元素来工作。 例子 输入arr = [7、5、1、6、3] 第一次迭代=> swap(7,5)=> swap(7,1)=> swap(7,6)=> swap(7,3)=> [5,1
冒泡排序(Bubble Sort)是常用的数组排序算法之一,它以简洁的思想与实现方法而备受青睐,也是广大学习者最先接触的一种排序算法。 冒泡排序的基本思想是:对比相邻的元素值,如果满足条件就交换元素值,把较小的元素值移动到数组前面,把大的元素值移动到数组后面(也就是交换两个元素的位置),这样数组元素就像气泡一样从底部上升到顶部。 冒泡排序的算法比较简单,排序的结果稳定,但时间效率不太高。 Java
本文向大家介绍Java冒泡排序简单实现,包括了Java冒泡排序简单实现的使用技巧和注意事项,需要的朋友参考一下 算法描述:对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和交换后,n个记录中的最大记录将位于第n位;然后对前(n-1)个记录进行第二轮比较;重复该过程直到进行比较的记录只剩下一个为止。 冒泡排序是非常好理解的,以从小
本文向大家介绍java冒泡排序和快速排序代码,包括了java冒泡排序和快速排序代码的使用技巧和注意事项,需要的朋友参考一下 冒泡排序: 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 快速排序: 算法:当数据量很大适宜采用该方法。采用二分
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位