当前位置: 首页 > 知识库问答 >
问题:

如何使用插入排序对单链表进行排序?

寇宏义
2023-03-14

这是我的节点类:

class Node:
def __init__(self, initData, initNext):
    """ Constructs a new node and initializes it to contain
    the given object (initData) and link to the given next node. """

    self.data = initData
    self.cover = True
    self.next = initNext

    # Additional attributes

def getData(self):
    """ Returns the element """
    return self.data

def getNext(self):
    """ Returns the next node """
    return self.next

def getDisplay(self):
    #TODO
    if self.cover == True:
        return '_'
    elif self.cover == False:
        return self.data

def html" target="_blank">setData(self, newData):
    """ Sets newData as the element """
    self.data = newData

def setNext(self, newNext):
    """ Sets newNext as the next node """
    self.next = newNext

def setDisplay(self, newDisplay):
    #TODO
    if newDisplay == self.data:
        self.cover = False
    elif newDisplay != self.data:
        self.cover = True

我有一个单链表,需要使用插入排序进行排序。我对常规列表的插入排序有很好的理解,但对链表没有。我发现另一个帖子,一个用户说:

让我们考虑一下插入排序是如何工作的:它将列表“拆分”(理论上)为三组:已排序的子集(可能为空)、当前项和未排序的子集(可能为空)。排序当前项之前的所有内容。当前项之后的所有内容都可以排序,也可以不排序。算法检查当前项,并将其与下一项进行比较。请记住,当前项之后的第一项属于未排序的子集。

让我们假设您正在按递增顺序对整数排序(因此给定“3,1,5,2,4”,您希望得到“1,2,3,4,5”)。将当前项设置为列表中的第一项。现在开始排序:

如果下一项大于当前项,则不需要对该项进行排序。只需将其设置为“当前项”并继续。

如果下一项小于当前项,则您有一些工作要做。首先,将下一个项目保存在某个地方,比如说保存在一个名为temp的指针中,然后将下一个项目从列表中“删除”,方法是将其设置为当前-

要么从列表的开头开始,一直向前,直到你找到正确的位置。完成后,在那里插入项目,然后继续进行插入排序。如果您有一个单链表,这是最简单的解决方案。你向后走,直到你找到物品的正确位置。完成后,在那里插入项目,然后继续进行插入排序。这有点复杂,但是如果你有一个双链表,它可以很好地工作。您继续这个过程,直到您到达列表的末尾。一旦您到达它,您就知道您已经完成了插入排序,并且列表处于正确的排序顺序。

我希望这有帮助。

答案链接

我试图让我的代码后,这篇文章,但不知道如何找到正确的地方项目,然后插入它。这是我的代码:

def sort(self):
    head = self.linkedList.head
    current = head
    while current != None:
        if current.getNext().getData() > current.getData():
            current = current.getNext()
        else:
            temp = current
            current.setNext(current.getNext().getNext())
            #I am not sure what to do here

有人能帮我吗?

共有3个答案

施刚毅
2023-03-14

引用的文本简要描述了您需要执行的操作:

从列表的开头开始,一直向前,直到你找到正确的位置。完成后,在那里插入项目,然后继续进行插入排序。

您已经获得了对列表开头的引用,因此从那里开始再次迭代,以找到放置不合适节点的位置。您可能需要一些额外的逻辑来处理在列表的最开始插入一个新指针(因为您需要从外部对象更新head指针),但除此之外,一切都应该非常简单。

华星剑
2023-03-14

基本上需要两个指针,一个用于外循环,一个用于内循环。因为您通常使用while循环,例如:`while(curr-

程志新
2023-03-14

您必须移动后继节点,它没有被很好地排序到正确的位置。

循环的终止条件为:

而当前!=无:
而current.getNext()!=无:

从列表中提取节点:

temp = current.getNext()
current.setNext(temp.getNext())

然后你必须区分两种情况。首先处理节点(temp)是列表的新标题时的情况:

if head.getData() > temp.getData():
    temp.setNext(head)
    self.linkedList.head = temp
    head = self.linkedList.head

在另一种情况下,必须找到前置节点。这意味着节点(inpos)必须放置在节点(temp)之后:

inpos = head
while temp.getData() > inpos.getNext().getData():
    inpos = inpos.getNext()

inpos之后插入temp

temp.setNext(inpos.getNext())
inpos.setNext(temp)

排序方法:

def sort(self):
    head = self.linkedList.head
    current = head
    while current.getNext() != None:
        if current.getNext().getData() > current.getData():
            current = current.getNext()
        else:
            temp = current.getNext()
            current.setNext(temp.getNext())
            if head.getData() > temp.getData():
                temp.setNext(head)
                self.linkedList.head = temp
                head = self.linkedList.head
            else:
                inpos = head
                while temp.getData() > inpos.getNext().getData():
                    inpos = inpos.getNext()
                temp.setNext(inpos.getNext())
                inpos.setNext(temp)
 类似资料:
  • 问题内容: 我需要按字母顺序对链接列表进行排序。我有一个完整的乘客姓名链接列表,需要将乘客姓名按字母顺序排序。一个人怎么做?有人有参考资料或视频吗? 问题答案: 您可以用来按字母顺序对事物进行排序。

  • 我试图在C中的双向链表上做插入排序。在这种状态下,我的代码让我陷入了一个没有结束的循环,吐出了8和9。 有人能好心解释一下“插入排序”方法是如何设计的吗? 我的链表是设计包含头,上一个,下一个和一些数据。 到目前为止这是我的代码 我的希望破灭了。请帮忙。

  • 本文向大家介绍如何使用JavaScript对HTML列表进行排序?,包括了如何使用JavaScript对HTML列表进行排序?的使用技巧和注意事项,需要的朋友参考一下 要使用JavaScript对HTML列表进行排序,代码如下- 示例 输出结果 上面的代码将产生以下输出- 在点击“点击排序”按钮-

  • 本文向大家介绍如何使用JavaScript对HTML表格进行排序?,包括了如何使用JavaScript对HTML表格进行排序?的使用技巧和注意事项,需要的朋友参考一下 排序使用JavaScript的HTML表格,代码如下 - 示例 输出结果 上面的代码将产生以下输出 - 在点击排序按钮-

  • 有什么算法让它成为一个链表的并行排序值得吗? 众所周知,合并排序是用于排序链表的最佳算法。 大多数合并排序都是根据数组来解释的,每一半都是递归排序的。这将使并行化变得微不足道:对每一半独立排序,然后合并两半。 但是链表没有“中途”点;链表一直持续到结束: 头→[a]→[b]→[c]→[d]→[e]→[f]→[g]→[h]→[i]→[j]→… 我现在使用的实现遍历列表一次以获取计数,然后递归地拆分计

  • 我想从创建一个排序词 以下是我到目前为止的情况。 我不理解编译器的信息: 我到底做错了什么?