📜  单向链表的插入排序(1)

📅  最后修改于: 2023-12-03 14:50:28.834000             🧑  作者: Mango

单向链表的插入排序

单向链表是一种常用的数据结构,其中每个节点都包含一个指针,指向下一个节点。在单向链表中,每个节点只能访问它后面的节点,因此对链表进行排序时,需要使用一种特殊的算法——插入排序。

插入排序的基本思想是将一个元素插入到已排序序列中的适当位置。在单向链表中,插入排序将从头节点开始,逐个将剩余节点插入到已排序部分的适当位置。插入排序的时间复杂度是 O(n^2),与冒泡排序和选择排序相同,但插入排序的常数因子较小,因此通常表现更优。

以下是实现单向链表的插入排序的代码片段:

class Node:
    def __init__(self, val):
        self.val = val
        self.next = None
        
    def __repr__(self):
        return str(self.val)

def insertion_sort(head: Node):
    if not head or not head.next:
        return head
    
    dummy = Node(0)
    dummy.next = head
    last_sorted = head
    
    cur = last_sorted.next
    while cur:
        if cur.val < last_sorted.val:
            pre = dummy
            while pre.next.val < cur.val:
                pre = pre.next
            last_sorted.next = cur.next
            cur.next = pre.next
            pre.next = cur
            cur = last_sorted.next
        else:
            last_sorted = last_sorted.next
            cur = last_sorted.next
            
    return dummy.next

上述插入排序算法将单向链表分成两个部分:已排序部分和未排序部分。在排序过程中,每次从未排序部分中取出一个节点,在已排序部分寻找插入位置并插入。由于单向链表只能从前向后访问,因此需要设置“哨兵节点”(本例中为 dummy)来辅助操作。

该算法的时间复杂度为 O(n^2),空间复杂度为 O(1)。插入排序是一种稳定排序算法,因此对于值相等的节点,排序前后它们的相对位置不会改变。