📌  相关文章
📜  通过交换节点对链接列表进行冒泡排序(1)

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

通过交换节点对链接列表进行冒泡排序

简介

在计算机科学中,冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的列表,比较相邻的两个元素,如果顺序不对则交换它们的位置。因为排序时小的元素会像气泡一样浮到列表的顶端,故名“冒泡排序”。

在本文中,我们将介绍如何通过交换节点对链接列表进行冒泡排序。我们还将讨论有关链接列表和节点的一些基础知识。

链接列表和节点

链接列表是一个包含一个或多个节点的数据结构。每个节点包含两个数据项:一个存储数据的值和一个指向列表中下一个节点的指针。

我们可以通过一个节点对象的 valuenext 属性来表示一个链接列表节点。其中,value 属性存储节点的值,next 属性存储指向下一个节点的引用。例如:

const node1 = { value: 3, next: null };
const node2 = { value: 7, next: null };
const node3 = { value: 1, next: null };
node1.next = node2;
node2.next = node3;

上面的代码创建了一个包含三个节点的链接列表。其中,第一个节点的值为 3,指向第二个节点;第二个节点的值为 7,指向第三个节点;第三个节点的值为 1,没有指向其他节点。

冒泡排序

接下来,我们将通过交换节点对链接列表进行冒泡排序。

function bubbleSort(head) {
  if (!head || !head.next) {
    return head;
  }
  let hasChanged = false;
  let newHead = head;
  let prev = null;
  while (head.next) {
    if (head.value > head.next.value) {
      hasChanged = true;
      const next = head.next;
      head.next = next.next;
      next.next = head;
      if (prev) {
        prev.next = next;
      } else {
        newHead = next;
      }
      prev = next;
    } else {
      prev = head;
      head = head.next;
    }
  }
  if (hasChanged) {
    newHead = bubbleSort(newHead);
  }
  return newHead;
}

上面的代码中,bubbleSort 函数接受一个链表的头节点 head,并返回排好序的链表的头节点。我们通过不断地遍历链表,如果当前节点比下一个节点大,就交换它们的位置。如果遍历过程中发生了交换,则继续对已排序的子列表进行冒泡排序。

总结

通过交换节点对链接列表进行冒泡排序是一种简单而有效的算法。它不仅可以用于排序数字,还可以用于排序其他类型的值,例如字符串或自定义对象。如果你想要深入了解排序算法,建议学习快速排序、归并排序和堆排序等高效的算法。