📅  最后修改于: 2023-12-03 15:22:49.694000             🧑  作者: Mango
在Java中,我们经常需要对数据进行排序。单链表是一种非常常见的数据结构,在此我们介绍一种基于单链表的快速排序算法。
快速排序是一种非常高效的排序算法。它的基本思想是通过一次排序将待排序的数据集合分割成独立的两部分,其中一部分的所有数据比另一部分的小,然后再按照这种方式分别对两部分继续进行排序,直到整个序列有序为止。
本程序的目的是实现基于单链表的快速排序算法。程序输入一个单链表的头节点,输出排序后的单链表的头节点。
程序的实现基于两个主要的方法:
partition()
方法实现了将一个单链表按照某个元素分为两部分的操作。quickSort()
递归调用partition()
方法完成排序。下面是本程序的核心代码。
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode pivot = head;
ListNode p = head.next;
while (p != null) {
if (p.val < pivot.val) {
pivot.next = p.next;
p.next = head;
head = p;
p = pivot.next;
} else {
pivot = p;
p = p.next;
}
}
ListNode left = sortList(head);
ListNode right = sortList(pivot.next);
pivot.next = right;
if (left == null) {
return pivot;
}
ListNode p1 = left;
while (p1.next != null) {
p1 = p1.next;
}
p1.next = pivot;
return left;
}
其中,ListNode
是单链表的节点类。具体代码如下。
public class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
使用本程序非常简单。首先,需要定义一个符合要求的单链表。例如,下面是一个单链表。
ListNode head = new ListNode(3);
head.next = new ListNode(5);
head.next.next = new ListNode(1);
head.next.next.next = new ListNode(2);
接着,将单链表输入到sortList()
方法中。
head = sortList(head);
排序后的单链表的头节点即为返回值head
。
基于单链表的快速排序算法是一种非常高效的排序算法。本程序在实现上使用了递归和基于元素pivot
的分割操作。程序实现简单,对于初学者来说非常容易上手。