数据结构与算法之数据结构 链表排序 归并排序 / 插入排序 实践

数据结构与算法阿木 发布于 5 天前 2 次阅读


摘要:

链表作为一种常见的数据结构,在计算机科学中有着广泛的应用。链表排序是链表操作中的重要一环,本文将围绕链表排序这一主题,分别介绍归并排序和插入排序两种算法在链表中的应用,并通过代码实现来展示这两种排序算法的原理和优势。

一、

链表是一种非线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表排序是链表操作中的一项基本任务,常见的排序算法有归并排序和插入排序。本文将分别介绍这两种算法在链表中的应用,并通过代码实现来展示其原理和优势。

二、归并排序在链表中的应用

归并排序是一种分治算法,其基本思想是将待排序的序列分为若干个子序列,分别进行排序,然后将排序好的子序列合并成一个完整的有序序列。归并排序在链表中的应用如下:

1. 归并排序的基本步骤

(1)将链表分为若干个子链表,每个子链表包含一个节点;

(2)对每个子链表进行排序;

(3)将排序好的子链表合并成一个完整的有序链表。

2. 代码实现

python

class ListNode:


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


self.val = val


self.next = next

def merge_sort(head):


if not head or not head.next:


return head

分割链表


middle = get_middle(head)


next_to_middle = middle.next


middle.next = None

对分割后的链表进行归并排序


left = merge_sort(head)


right = merge_sort(next_to_middle)

合并排序好的链表


sorted_list = merge(left, right)


return sorted_list

def get_middle(head):


if not head:


return head

slow = head


fast = head


while fast.next and fast.next.next:


slow = slow.next


fast = fast.next.next


return slow

def merge(left, right):


if not left:


return right


if not right:


return left

if left.val <= right.val:


temp = left


left = left.next


else:


temp = right


right = right.next

head = temp


while left and right:


if left.val <= right.val:


temp.next = left


left = left.next


else:


temp.next = right


right = right.next


temp = temp.next


if not left:


temp.next = right


if not right:


temp.next = left

return head


三、插入排序在链表中的应用

插入排序是一种简单直观的排序算法,其基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。插入排序在链表中的应用如下:

1. 插入排序的基本步骤

(1)将链表中的第一个节点视为已排序的子序列;

(2)从第二个节点开始,将每个节点插入到已排序的子序列中;

(3)重复步骤(2),直到所有节点都插入完成。

2. 代码实现

python

class ListNode:


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


self.val = val


self.next = next

def insertion_sort(head):


if not head or not head.next:


return head

sorted_list = ListNode(0)


current = head


while current:


next_node = current.next


sorted_list = sorted_insert(sorted_list, current)


current = next_node

return sorted_list.next

def sorted_insert(sorted_list, node):


if not sorted_list or sorted_list.val >= node.val:


node.next = sorted_list


return node

current = sorted_list


while current.next and current.next.val < node.val:


current = current.next

node.next = current.next


current.next = node


return sorted_list


四、总结

本文介绍了归并排序和插入排序两种算法在链表中的应用。通过代码实现,展示了这两种排序算法的原理和优势。在实际应用中,可以根据链表的特点和需求选择合适的排序算法,以提高排序效率。