JavaScript实现的七种排序算法总结(推荐!)

JavaScript实现的七种排序算法总结(推荐!)

简介

本文介绍了JavaScript实现的七种排序算法,包括插入排序、冒泡排序、选择排序、希尔排序、归并排序、快速排序和堆排序。每种算法都有对应的JavaScript代码实现,并且详细说明了算法的原理、时间复杂度和代码实现过程。

插入排序

插入排序是一种简单的排序算法,它的基本思想是将数组分成已排序和未排序两部分,遍历未排序部分的每一个元素,将其插入到已排序部分的合适位置。

时间复杂度:O(n^2)

JavaScript代码实现:

function insertionSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    for (let j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
      [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
    }
  }
  return arr;
}

示例说明:

let arr = [4, 2, 5, 3, 1];
console.log(insertionSort(arr)); // 输出 [1, 2, 3, 4, 5]

冒泡排序

冒泡排序是一种运算简单的排序算法,它的基本思想是遍历数组,将相邻的两个元素进行比较,如果顺序不对就交换位置,直到整个数组都是有序的。

时间复杂度:O(n^2)

JavaScript代码实现:

function bubbleSort(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

示例说明:

let arr = [4, 2, 5, 3, 1];
console.log(bubbleSort(arr)); // 输出 [1, 2, 3, 4, 5]

选择排序

选择排序是一种简单而直观的排序算法,它的基本思想是每次从未排序的数组中选出一个最小值,插入到已排序数组的末尾。

时间复杂度:O(n^2)

JavaScript代码实现:

function selectionSort(arr) {
  for (let i = 0; i < arr.length - 1; i++) {
    let minIndex = i;
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[j] < arr[minIndex]) {
        minIndex = j;
      }
    }
    if (i !== minIndex) {
      [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
    }
  }
  return arr;
}

示例说明:

let arr = [4, 2, 5, 3, 1];
console.log(selectionSort(arr)); // 输出 [1, 2, 3, 4, 5]

希尔排序

希尔排序是一个高效的插入排序算法,它的基本思想是先将待排序的数组按照一定的间隔分成若干个子数组,对每个子数组进行插入排序,随着间隔的逐渐缩小,子数组的个数也逐渐减少,最终达到对整个数组进行排序的目的。

时间复杂度:O(n^1.3)

JavaScript代码实现:

function shellSort(arr) {
  const len = arr.length;
  for (let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
    for (let i = gap; i < len; i++) {
      let j = i;
      while (j - gap >= 0 && arr[j] < arr[j - gap]) {
        [arr[j], arr[j - gap]] = [arr[j - gap], arr[j]];
        j -= gap;
      }
    }
  }
  return arr;
}

示例说明:

let arr = [4, 2, 5, 3, 1];
console.log(shellSort(arr)); // 输出 [1, 2, 3, 4, 5]

归并排序

归并排序是一种基于分治思想的排序算法,它的基本思想是将一个大问题拆分成若干个小问题,然后对每个小问题进行排序,最后将所有小问题的排序结果合并成一个有序序列。

时间复杂度:O(nlogn)

JavaScript代码实现:

function mergeSort(arr) {
  if (arr.length < 2) {
    return arr;
  }
  const mid = Math.floor(arr.length / 2);
  const left = arr.slice(0, mid);
  const right = arr.slice(mid);
  return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
  const result = [];
  while (left.length && right.length) {
    if (left[0] <= right[0]) {
      result.push(left.shift());
    } else {
      result.push(right.shift());
    }
  }
  while (left.length) {
    result.push(left.shift());
  }
  while (right.length) {
    result.push(right.shift());
  }
  return result;
}

示例说明:

let arr = [4, 2, 5, 3, 1];
console.log(mergeSort(arr)); // 输出 [1, 2, 3, 4, 5]

快速排序

快速排序是一种高效的排序算法,它的基本思想是通过一次遍历将待排序数组分为两个部分,一部分比基准值小,一部分比基准值大,然后递归地对每个子数组进行上述操作,直到所有子数组都有序。

时间复杂度:O(nlogn)

JavaScript代码实现:

function quickSort(arr) {
  if (arr.length < 2) {
    return arr;
  }
  const pivot = arr[0];
  const left = [];
  const right = [];
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return [...quickSort(left), pivot, ...quickSort(right)];
}

示例说明:

let arr = [4, 2, 5, 3, 1];
console.log(quickSort(arr)); // 输出 [1, 2, 3, 4, 5]

堆排序

堆排序是一种树形选择排序算法,它的基本思想是将待排序序列构造成一个大顶堆或小顶堆,然后每次取出堆顶元素,再调整堆结构,直到整个序列有序。

时间复杂度:O(nlogn)

JavaScript代码实现:

function heapSort(arr) {
  buildHeap(arr);
  for (let i = arr.length - 1; i >= 0; i--) {
    [arr[0], arr[i]] = [arr[i], arr[0]];
    heapify(arr, i, 0);
  }
  return arr;
}

function buildHeap(arr) {
  const len = arr.length;
  for (let i = Math.floor(len / 2); i >= 0; i--) {
    heapify(arr, len, i);
  }
}

function heapify(arr, len, i) {
  let largest = i;
  const left = 2 * i + 1;
  const right = 2 * i + 2;
  if (left < len && arr[left] > arr[largest]) {
    largest = left;
  }
  if (right < len && arr[right] > arr[largest]) {
    largest = right;
  }
  if (largest !== i) {
    [arr[i], arr[largest]] = [arr[largest], arr[i]];
    heapify(arr, len, largest);
  }
}

示例说明:

let arr = [4, 2, 5, 3, 1];
console.log(heapSort(arr)); // 输出 [1, 2, 3, 4, 5]

总结

上文介绍了JavaScript实现的七种排序算法,并且提供了每个算法的JavaScript代码实现和时间复杂度分析,希望可以对读者有所帮助。在实际应用中,选择合适的排序算法可以大幅度提高运行效率,是一项重要的编程技能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现的七种排序算法总结(推荐!) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • C++中二叉堆排序详解

    C++中二叉堆排序详解 什么是二叉堆排序 二叉堆是一种特殊的二叉树,它有两个特性: 根节点的键值是所有节点中最小/最大的; 对于节点i的键值一定不大/小于它的父节点i/2。 根据第二个规则,我们可以对于任何一个节点i,以i为根的子树都是一个小根堆/大根堆。将二叉堆中最小/最大的根节点取出,然后将最后一个节点放到根位置,再对根节点进行一次向下调整的操作,就可以…

    算法与数据结构 2023年5月19日
    00
  • c++实现排序算法之希尔排序方式

    C++实现排序算法之希尔排序 前置知识 希尔排序是一种基于插入排序的排序算法 插入排序是一种简单直观的排序算法 算法思路 希尔排序是一种分组插入排序的算法。它的基本思想是:先将待排序序列按照一定规则分成若干子序列,对各个子序列进行插入排序,然后逐步缩小子序列的长度,最终使整个序列成为一个有序序列。 例如,对于一个序列 5 2 8 9 1 3 7 6 4,我们…

    算法与数据结构 2023年5月19日
    00
  • JavaScript插入排序算法原理与实现方法示例

    JavaScript插入排序算法原理与实现方法示例 算法原理 插入排序是一种简单直观的排序算法,其基本原理是将一个待排序的数组依次插入一个有序的数组中,使得最终生成的有序数组是全局有序的。每次将一个待排序的元素插入到有序数组中时,我们从有序数组的末尾开始比较,如果待排序的元素比当前比较的元素小,则交换位置,继续比较,否则插入到当前位置。 实现方法 下面是Ja…

    算法与数据结构 2023年5月19日
    00
  • Python实现选择排序

    当我们需要对一个列表或数组进行排序时,选择排序是一种简单易懂的方法。Python是一种非常流行的编程语言,它可以轻松实现选择排序。 以下是Python实现选择排序的攻略: 选择排序的原理 选择排序是一种简单直观的排序算法,其基本思想是每次选择出最小的元素,放到已经排好序的部分的末尾。 实现步骤 找到未排序部分的最小元素; 将其放在已排序部分的末尾; 重复步骤…

    算法与数据结构 2023年5月19日
    00
  • C语言冒泡排序法的实现(升序排序法)

    冒泡排序是一种简单的排序算法。它会依次比较相邻两个元素,如果它们的顺序错误就交换它们的位置,直到所有元素都排列成功。 以下是C语言冒泡排序的实现过程: 1.先定义数组 代码示例: int a[10] = {23, 56, 12, 45, 9, 17, 98, 67, 41, 3}; 2.开始排序 首先,我们需要使用两层循环来遍历每一个元素。 外层循环从第一个…

    算法与数据结构 2023年5月19日
    00
  • C#算法之全排列递归算法实例讲解

    C#算法之全排列递归算法实例讲解 什么是全排列? 全排列是指将一个给定的集合中的元素进行排列,使得每个元素只出现一次,且每个元素在排列中的位置是不确定的,从而得到的所有不同排列。比如给定集合{1, 2, 3}的全排列包括{1, 2, 3}、{1, 3, 2}、{2, 1, 3}、{2, 3, 1}、{3, 1, 2}和{3, 2, 1}。 递归算法实现全排列…

    算法与数据结构 2023年5月19日
    00
  • C语言排序方法(冒泡,选择,插入,归并,快速)

    下面是关于C语言排序方法冒泡、选择、插入、归并、快速的详细攻略: 冒泡排序 冒泡排序是一种最简单的排序算法,它的核心思想是从左到右依次比较相邻的两个元素,如果前一个元素大于后一个元素,就交换它们的位置,这样一遍比较后,最大的元素就会被“冒泡”到最右边。然后再对剩余的元素重复同样的操作,这样一直迭代直到整个序列排序完成。 下面是标准的C语言冒泡排序代码示例: …

    算法与数据结构 2023年5月19日
    00
  • Java针对ArrayList自定义排序的2种实现方法

    这里给出针对ArrayList自定义排序的两种方法的详细攻略,分别为使用Comparator接口和使用Comparable接口。 1.使用Comparator接口 Comparator接口是JAVA中的一个接口, 我们可以在其中实现自定义的一些比较规则, 然后使用这些规则去对一些数据进行排序。 接下来是这种方式的实现步骤: 第一步:定义比较规则 我们需要实现…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部