JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】

JS前端面试必备——基本排序算法原理与实现方法详解

在前端面试中,算法是一个必考的考点,掌握一些基本的排序算法对于一个前端工程师来说是非常重要的。

排序算法的分类

排序算法可以按照许多不同的标准进行分类:

  • 平均时间复杂度
  • 空间复杂度
  • 稳定性
  • 内部排序和外部排序

在这篇文章中,我们将按照时间复杂度从小到大的顺序介绍以下五个基本的排序算法:插入排序、选择排序、归并排序、冒泡排序和快速排序。

插入排序(Insertion Sort)

插入排序的算法思想是将一个待排序的数组,分成两部分,第一部分是已经排序的部分(第一个元素),第二部分是待排序的部分(第二个元素到最后一个元素)。然后,从待排序的部分中取出一个元素,将它插入到已经排序的部分中,使得还是有序的。

插入排序的时间复杂度是 O(n^2),它最好的情况下可以达到 O(n),但是最坏的情况下达到 O(n^2)。

插入排序的JavaScript代码实现如下:

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

// 运行示例
let arr = [5, 3, 8, 4, 2, 1, 9, 7, 6];
let sortedArr = insertionSort(arr);
console.log(sortedArr); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

选择排序(Selection Sort)

选择排序的算法思想是将一个待排序的数组,分成两部分,第一部分是已经排序的部分(第一个元素),第二部分是待排序的部分(第二个元素到最后一个元素)。然后,从待排序的部分中寻找最小的一个元素,将它放到已经排序部分的最后。

选择排序的时间复杂度是 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;
      }
    }
    let temp = arr[i];
    arr[i] = arr[minIndex];
    arr[minIndex] = temp;
  }
  return arr;
}

// 运行示例
let arr = [5, 3, 8, 4, 2, 1, 9, 7, 6];
let sortedArr = selectionSort(arr);
console.log(sortedArr); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

归并排序(Merge Sort)

归并排序的算法思想是将一个待排序的数组,分成两部分,然后将每一部分都排序,再将两部分归并成一个有序的数组。

归并排序的时间复杂度是 O(nlogn)。

归并排序的JavaScript代码实现如下:

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

function merge(left, right) {
  let 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 = [5, 3, 8, 4, 2, 1, 9, 7, 6];
let sortedArr = mergeSort(arr);
console.log(sortedArr); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

冒泡排序(Bubble Sort)

冒泡排序的算法思想是将一个待排序的数组,从左到右依次比较相邻的两个元素的大小,如果前一个元素的值比后一个元素的值大,则交换这两个元素的位置。每一轮比较完,最后一个元素一定是最大的,下一轮比较时可以忽略这个元素,因此每一轮可以少比较一次,并且比较的元素个数一定减一。

冒泡排序的时间复杂度是 O(n^2)。

冒泡排序的JavaScript代码实现如下:

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

// 运行示例
let arr = [5, 3, 8, 4, 2, 1, 9, 7, 6];
let sortedArr = bubbleSort(arr);
console.log(sortedArr); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

快速排序(Quick Sort)

快速排序的算法思想是选取一个基准值,然后将数组中的值分为两部分,一部分是小于基准值的,一部分是大于等于基准值的。然后递归对这两部分进行快速排序,最终得到一个有序的数组。

快速排序的时间复杂度是 O(nlogn)。

快速排序的JavaScript代码实现如下:

function quickSort(arr, left = 0, right = arr.length - 1) {
  if (left < right) {
    let pivotIndex = partition(arr, left, right);
    quickSort(arr, left, pivotIndex - 1);
    quickSort(arr, pivotIndex + 1, right);
  }
  return arr;
}

function partition(arr, left, right) {
  let pivot = arr[right];
  let i = left - 1;
  for (let j = left; j <= right - 1; j++) {
    if (arr[j] < pivot) {
      i++;
      let temp = arr[i];
      arr[i] = arr[j];
      arr[j] = temp;
    }
  }
  let temp = arr[right];
  arr[right] = arr[i + 1];
  arr[i + 1] = temp;
  return i + 1;
}

// 运行示例
let arr = [5, 3, 8, 4, 2, 1, 9, 7, 6];
let sortedArr = quickSort(arr);
console.log(sortedArr); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

结语

以上就是五个常见的排序算法,在面试中,你可以根据实际情况给出最优的答案。一般来说,归并排序和快速排序是最常用的排序算法,因为它们的时间复杂度比较小。如果待排序的数组比较小,插入排序和选择排序也是很不错的选择。而冒泡排序则是最不推荐使用的排序算法,因为它的时间复杂度最高。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】 - Python技术站

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

相关文章

  • C语言实现交换排序算法(冒泡,快速排序)的示例代码

    C语言实现交换排序算法(冒泡排序、快速排序)通常分为以下步骤: 分析算法:首先,我们需要对选定的排序算法进行仔细的分析,了解排序过程中的基本操作、时间复杂度和空间复杂度等基本信息。 编写函数:依照分析结果,编写函数实现排序算法。同时,考虑如何优化代码以提高排序效率。 测试函数:编写测试代码对排序函数进行测试,检查是否正确。 以下是两个示例说明: 冒泡排序 冒…

    算法与数据结构 2023年5月19日
    00
  • c语言5个常用的排序算法实例代码

    C语言5个常用的排序算法实例代码 本文旨在讲解C语言中常用的5种排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。以下将逐一介绍它们的实现过程,并提供示例代码。 冒泡排序(Bubble Sort) 算法思想:冒泡排序是一种简单的排序算法,它会首先比较相邻的元素,如果它们的顺序不正确,就交换它们的位置。这样一遍比较下来,最后一个元素就已经是最大的…

    算法与数据结构 2023年5月19日
    00
  • Python实现查找数组中任意第k大的数字算法示例

    Python实现查找数组中任意第k大的数字算法示例 本文将介绍如何使用Python语言实现查找数组中任意第k大的数字算法,并提供两个示例进行说明。 算法概述 查找数组中任意第k大的数字算法通常采用快速排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再按此方法对这两部分记录分别进行快速排序…

    算法与数据结构 2023年5月19日
    00
  • Java 直接插入排序的三种实现

    Java 直接插入排序的三种实现 本文将介绍 Java 中直接插入排序的三种实现方式,分别为插入排序、希尔排序和折半插入排序。 插入排序 插入排序是一种简单直观的排序算法,其基本思想是将一个待排序的元素插入到已排好序列中的适当位置。 以下是 Java 中插入排序的实现代码: public static void insertSort(int[] arr) {…

    算法与数据结构 2023年5月19日
    00
  • JS实现的排列组合算法示例

    下面我将详细讲解一下JS实现的排列组合算法示例的完整攻略。 算法原理 JS实现的排列组合算法主要基于数学组合学,其核心思想是将需要进行排列组合的数据按照一定规则进行排列组合,得到所有可能的排列组合方式。这里我们首先介绍排列与组合的概念: 排列:从n个不同元素中取出m个元素进行排列,按照一定的顺序排列的所有可能的情况被称为排列。其中,n>m。 组合:从n…

    算法与数据结构 2023年5月19日
    00
  • 如何用C++实现A*寻路算法

    一、什么是A*寻路算法? A寻路算法(A search algorithm),也叫A算法,是一种启发式搜索算法,常用于求解路径规划问题。A算法结合了Dijkstra算法和启发式搜索的优点,能够在保证找到最短路径的情况下,大大降低搜索的时间和空间消耗。 二、A*寻路算法的原理 1.最短路径 在计算机科学中,最短路径问题是指两点之间的所有路径中,经过的边或节点数…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法系列之直接选择排序详解

    PHP排序算法系列之直接选择排序详解 一、前言 本文将详细讲解直接选择排序,直接选择排序是一个简单但常用的排序算法,对初学者来说是个很好的入门算法,代码也比较易懂。 二、算法原理 直接选择排序,是一种比较简单直观的排序算法。其基本思想为:将待排序的序列划分为已排序和未排序两部分,从未排序的序列中选择最小的元素,将其插入已排序序列的末尾,直到所有元素均排序完毕…

    算法与数据结构 2023年5月19日
    00
  • javascript冒泡排序小结

    JavaScript冒泡排序小结 什么是冒泡排序 冒泡排序是一种经典排序算法,它重复地走访过要排序的数列,每次比较相邻的两个元素,如果顺序不对则交换它们,直到没有需要交换的元素为止。 冒泡排序的步骤 冒泡排序的主要步骤如下: 比较相邻的元素。如果第一个比第二个大,就交换它们; 对每一对相邻的元素做同样的工作,从开始的第一对到结尾的最后一对,这样在最后的元素应…

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