当前位置:首页 > JavaScript

js实现无序链表排序

2026-01-31 01:51:47JavaScript

实现无序链表排序的方法

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

冒泡排序实现链表排序

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

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;
}

快速排序实现链表排序

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

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
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 j…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #34…