Python中链表的排序算法及其实现

2023-04-11 00:00:00 算法 排序 链表

Python中链表的排序算法主要有插入排序、选择排序和归并排序等,以下是它们的实现方式和代码演示。

  1. 插入排序

插入排序的思路很简单,就是将链表中的每一个元素插入到已排序的列表中,并最终得到完全有序的链表。具体实现时,可以使用一个哨兵节点作为有序列表的头部节点,然后从原始链表的第一个节点开始遍历,每遍历到一个节点,就将其插入到有序列表中。

代码演示:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def insertionSortList(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head

    dummy = ListNode(-1)
    dummy.next = head

    last_sorted = head
    curr = head.next

    while curr:
        if last_sorted.val <= curr.val:
            last_sorted = last_sorted.next
        else:
            prev = dummy
            while prev.next.val <= curr.val:
                prev = prev.next

            last_sorted.next = curr.next
            curr.next = prev.next
            prev.next = curr

        curr = last_sorted.next

    return dummy.next
  1. 选择排序

选择排序的思路是循环遍历链表,每次找到未排序部分中最小的节点,然后将其放到有序部分的末尾。具体实现时,需要维护一个已排好序部分的头部节点,初始为空,并将这个节点的next指向原始链表的头部节点,然后每次找到剩余未排序部分中最小的节点,并将其插入到已排序部分的末尾。

代码演示:

def selectionSortList(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head

    dummy = ListNode(-1)
    dummy.next = head

    sorted_tail = dummy

    while sorted_tail.next:
        min_node_prev = sorted_tail
        min_node = sorted_tail.next

        curr = sorted_tail.next

        while curr:
            if curr.val < min_node.val:
                min_node = curr
                min_node_prev = sorted_tail

            curr = curr.next

        min_node_prev.next = min_node.next
        min_node.next = sorted_tail.next
        sorted_tail.next = min_node
        sorted_tail = sorted_tail.next

    return dummy.next
  1. 归并排序

归并排序是一种非常高效的排序算法,它的思想是将链表分成两个部分,对每个部分进行递归调用归并排序,然后将两个已经排序的链表合并成一个链表。具体实现时,可以使用快慢指针将链表分成两个部分,然后递归调用归并排序,并将两个已经排序的链表合并成一个链表。

代码演示:

def mergeSortList(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head

    mid = findMid(head)
    right_head = mid.next
    mid.next = None

    return merge(mergeSortList(head), mergeSortList(right_head))

def findMid(head: ListNode):
    slow = head
    fast = head.next

    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next

    return slow

def merge(left: ListNode, right: ListNode):
    dummy = ListNode(-1)
    curr = dummy

    while left and right:
        if left.val <= right.val:
            curr.next = left
            left = left.next
        else:
            curr.next = right
            right = right.next

        curr = curr.next

    if left:
        curr.next = left

    if right:
        curr.next = right

    return dummy.next

相关文章