当前位置:首页 > JavaScript

js实现无序链表排序

2026-01-31 01:51:47JavaScript

实现无序链表排序的方法

在JavaScript中,可以使用多种方法对无序链表进行排序。以下是几种常见的实现方式,包括冒泡排序、归并排序和快速排序。

冒泡排序实现链表排序

冒泡排序是一种简单的排序算法,适用于链表结构。通过多次遍历链表,比较相邻节点的值并交换它们的位置,直到链表完全有序。

js实现无序链表排序

class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

function bubbleSortLinkedList(head) {
  if (!head || !head.next) return head;

  let swapped;
  do {
    swapped = false;
    let current = head;
    let prev = null;

    while (current && current.next) {
      if (current.value > current.next.value) {
        // 交换节点值
        const temp = current.value;
        current.value = current.next.value;
        current.next.value = temp;
        swapped = true;
      }
      prev = current;
      current = current.next;
    }
  } while (swapped);

  return head;
}

归并排序实现链表排序

归并排序是一种分治算法,适用于链表排序。通过递归地将链表分成两部分,分别排序后再合并。

function mergeSortLinkedList(head) {
  if (!head || !head.next) return head;

  // 使用快慢指针找到链表中点
  let slow = head;
  let fast = head.next;
  while (fast && fast.next) {
    slow = slow.next;
    fast = fast.next.next;
  }

  const mid = slow.next;
  slow.next = null;

  const left = mergeSortLinkedList(head);
  const right = mergeSortLinkedList(mid);

  return merge(left, right);
}

function merge(left, right) {
  const dummy = new Node(0);
  let tail = dummy;

  while (left && right) {
    if (left.value < right.value) {
      tail.next = left;
      left = left.next;
    } else {
      tail.next = right;
      right = right.next;
    }
    tail = tail.next;
  }

  tail.next = left || right;
  return dummy.next;
}

快速排序实现链表排序

快速排序通过选择一个基准值将链表分成两部分,递归地对两部分进行排序。

js实现无序链表排序

function quickSortLinkedList(head) {
  if (!head || !head.next) return head;

  const pivot = head.value;
  let less = new Node(0);
  let equal = new Node(0);
  let greater = new Node(0);
  let lessTail = less;
  let equalTail = equal;
  let greaterTail = greater;
  let current = head;

  while (current) {
    if (current.value < pivot) {
      lessTail.next = current;
      lessTail = lessTail.next;
    } else if (current.value === pivot) {
      equalTail.next = current;
      equalTail = equalTail.next;
    } else {
      greaterTail.next = current;
      greaterTail = greaterTail.next;
    }
    current = current.next;
  }

  lessTail.next = equalTail.next = greaterTail.next = null;

  less = quickSortLinkedList(less.next);
  greater = quickSortLinkedList(greater.next);

  equalTail.next = greater;
  if (!less) return equal.next;

  let lessTailFinal = less;
  while (lessTailFinal.next) {
    lessTailFinal = lessTailFinal.next;
  }
  lessTailFinal.next = equal.next;
  return less;
}

选择排序实现链表排序

选择排序通过每次选择未排序部分的最小值,将其放到已排序部分的末尾。

function selectionSortLinkedList(head) {
  if (!head || !head.next) return head;

  let current = head;
  while (current) {
    let minNode = current;
    let temp = current.next;

    while (temp) {
      if (temp.value < minNode.value) {
        minNode = temp;
      }
      temp = temp.next;
    }

    // 交换节点值
    const tempValue = current.value;
    current.value = minNode.value;
    minNode.value = tempValue;

    current = current.next;
  }

  return head;
}

插入排序实现链表排序

插入排序通过构建有序链表,逐个将未排序的节点插入到有序链表中。

function insertionSortLinkedList(head) {
  if (!head || !head.next) return head;

  const dummy = new Node(0);
  dummy.next = head;
  let lastSorted = head;
  let current = head.next;

  while (current) {
    if (lastSorted.value <= current.value) {
      lastSorted = lastSorted.next;
    } else {
      let prev = dummy;
      while (prev.next.value <= current.value) {
        prev = prev.next;
      }
      lastSorted.next = current.next;
      current.next = prev.next;
      prev.next = current;
    }
    current = lastSorted.next;
  }

  return dummy.next;
}

以上方法可以根据实际需求选择使用,归并排序和快速排序通常效率更高,适合处理较大的链表。

标签: 链表js
分享给朋友:

相关文章

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let curr…