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日

相关文章

  • Java算法之重新排列数组例题

    下面是我对“Java算法之重新排列数组例题”的完整攻略: 题目描述 对于一个给定的整数数组,让其中的偶数放在奇数之前,保持它们原有的相对顺序不变。例如,对于数组[1,2,3,4],需要修改为[1,3,2,4]。 思路分析 对于这个问题,我们可以利用双指针的思路解决。定义两个指针left和right,分别指向数组的头部和尾部。当left指向的数为偶数并且它在r…

    算法与数据结构 2023年5月19日
    00
  • 修复IE9&safari 的sort方法

    修复IE9和Safari的sort()方法需要遵循以下步骤: 1. 检查代码 要修复排序方法,首先需要检查代码,找出可能存在的问题。请确保你的代码中使用的是正确的sort()方法,并且没有拼写错误和语法问题。同时,还要检查你的代码能否适用于所有浏览器。 2. 自定义排序方法 当浏览器不支持sort()方法时,我们可以自定义一个排序方法来替代它。我们可以使用J…

    算法与数据结构 2023年5月19日
    00
  • C++实现自顶向下的归并排序算法

    下面是“C++实现自顶向下的归并排序算法”的完整攻略。 归并排序的概念 归并排序是一种分治法排序算法,它将一个大数组分成两个部分,分别对这两个部分进行排序,最后将两个排好序的部分合并起来。归并排序的时间复杂度为O(n log n)。 归并排序的步骤 实现归并排序需要以下三个步骤: 分割 – 将数组分成两个部分,分别对每个部分进行排序。该过程使用二分法来实现。…

    算法与数据结构 2023年5月19日
    00
  • 归并排序时间复杂度过程推导详解

    归并排序时间复杂度过程推导详解 什么是归并排序 归并排序是一种基于分治思想的排序算法,将一个无序的数组划分成若干子数组,对每个子数组进行排序,然后再将排好序的子数组进行合并,最终得到一个完整有序的数组。 归并排序的时间复杂度 归并排序的时间复杂度是O(nlogn),其中n表示数组的长度。接下来我们将详细讲解归并排序的时间复杂度推导过程。 假设有一个长度为n的…

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

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

    算法与数据结构 2023年5月19日
    00
  • STl中的排序算法详细解析

    STl中的排序算法详细解析 概述 在STL中,sort是一种常用的排序算法。sort算法旨在将元素从小到大排序,但也可以使用cmp函数指定排序方式。 算法实现 sort算法基于“快速排序”算法的实现。其基本思想是从待排序列中选取一定的数值作为划分元素(pivot),通过一趟排序将所有比该元素小的数放到它的左边,所有比该元素大的数放到它的右边,然后再对左右两个…

    算法与数据结构 2023年5月19日
    00
  • Java快速排序案例讲解

    Java快速排序案例讲解 快速排序(Quicksort)是一种常见的排序算法,它的时间复杂度为O(nlogn),是一种效率较高的排序算法,在实际开发中也广泛应用。本文将介绍Java快速排序的实现过程以及具体实现。 快速排序介绍 快速排序是通过选择一个“基准数”,然后把整个数组分成两部分,分别为小于等于“基准数”的部分和大于“基准数”的部分。然后再对这两个部分…

    算法与数据结构 2023年5月19日
    00
  • JS折半插入排序算法实例

    下面是介绍JS折半插入排序算法的完整攻略。 什么是折半插入排序算法? 折半插入排序是插入排序的一种改进算法,它的基本思路是利用二分查找找到某个待排元素在已排序序列中插入位置。 折半插入排序算法的时间复杂度为 O(nlogn),比普通插入排序 O(n^2)快。 折半插入排序算法实现步骤 折半插入排序算法的实现步骤如下: 从第二个元素开始,将整个序列分为已排序区…

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