当前位置:首页 > 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实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…