📜  冒泡排序链表java(1)

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

冒泡排序链表 - Java

简介

冒泡排序是一种基本的排序算法,是通过比较相邻元素大小来交换位置的排序算法。而链表是一种常用的数据结构。将冒泡排序与链表结合起来,可以实现链表中元素按大小排序的功能。

实现思路

冒泡排序的基本思路是:比较相邻的元素。如果第一个比第二个大,就交换它们两个;否则不交换。对于所有相邻的元素对,重复以上步骤,直到没有任何一对元素需要交换位置为止。

而对于链表,我们可以使用头插法来将元素插入到一个新的有序链表中。具体操作为,每次将未排序链表的第一个元素与有序链表中的元素比较大小,然后插入到正确的位置上,重复这个过程直到未排序链表为空。

代码实现
public static ListNode bubbleSortList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode newHead = new ListNode(0);
    newHead.next = head;
    ListNode lastExchange = head;
    ListNode tail = null;// 有序链表的尾指针
    while (lastExchange != null) {
        ListNode cur = newHead.next;
        ListNode pre = newHead;
        lastExchange = null;
        while (cur.next != null) {
            if (cur.val > cur.next.val) {
                pre.next = cur.next;
                cur.next = cur.next.next;
                pre.next.next = cur;
                lastExchange = cur;
            }
            pre = pre.next;
            cur = cur.next;
            if (lastExchange == null) {
                tail = cur;
            }
        }
    }
    return newHead.next;
}

其中,ListNode 是一个定义好的链表节点类,结构如下所示:

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}
性能分析

时间复杂度:O(N^2),其中 N 是链表的长度。对于链表,每次比较都需要遍历链表的长度,一共需要进行 N 次比较,因此时间复杂度为 O(N^2)。

空间复杂度:O(1),没有使用额外的空间,只需要用一个临时变量来交换节点的位置。