📜  使用冒泡排序对链表进行排序 (1)

📅  最后修改于: 2023-12-03 15:36:38.279000             🧑  作者: Mango

使用冒泡排序对链表进行排序

冒泡排序是一种基本排序算法,其核心思想是比较相邻元素,如果它们的顺序不正确,则交换它们。对于一个无序的链表,可以使用冒泡排序来对其进行排序。

实现思路

使用两个指针p和q,分别指向链表的头结点和头结点的下一个结点,循环遍历链表,每次比较p和q所指向的结点的值,如果p > q,则交换它们的值。遍历完一遍后,q指向头结点的下一个结点,再次循环遍历,直到没有需要交换的结点为止,排序完成。

代码实现
def bubble_sort_linked_list(head):
    if not head or not head.next:
        return head

    p = head
    q = head.next
    end = None

    while end != head.next:
        while q != end:
            if p.val > q.val:
                p.val, q.val = q.val, p.val
            p = q
            q = q.next
        end = p
        p = head
        q = head.next
    return head
测试结果

为了验证排序结果是否正确,可以编写一个测试用例来测试。

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

def create_linked_list(nums):
    head = Node()
    p = head
    for num in nums:
        p.next = Node(num)
        p = p.next
    return head.next

def linked_list_to_list(head):
    res = []
    p = head
    while p:
        res.append(p.val)
        p = p.next
    return res

def test_bubble_sort_linked_list():
    nums = [6, 5, 3, 1, 8, 7, 2, 4]
    head = create_linked_list(nums)

    new_head = bubble_sort_linked_list(head)

    assert linked_list_to_list(new_head) == sorted(nums)

test_bubble_sort_linked_list()
结论

对于一个无序的链表,使用冒泡排序算法可以对其进行排序,代码实现简单,时间复杂度为O(n ^ 2)。