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日

相关文章

  • java排序算法图文详解

    Java排序算法图文详解 在Java编程中,排序算法是非常重要且常见的一部分。本文将详细讲解Java中的各种排序算法及其实现,帮助读者了解不同算法的特点和使用场景,提高程序的效率和可读性。 排序算法分类 在Java中,常用的排序算法主要可以分为以下几类: 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 冒泡排序 冒泡排序是一种简单的排序算法,其原理…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现经典排序算法之冒泡排序

    JavaScript实现经典排序算法之冒泡排序 什么是冒泡排序? 冒泡排序是一种简单的排序算法,从序列左侧开始比较两个相邻的元素,如果顺序不对就交换位置,直到序列末尾,这样一次遍历后,序列最后一个元素就是当前序列最大值。然后对剩余序列重复上述过程,直到整个序列有序。 算法实现 我们来看看如何用JavaScript实现冒泡排序。 function bubble…

    算法与数据结构 2023年5月19日
    00
  • 可能是你看过最全的十大排序算法详解(完整版代码)

    针对“可能是你看过最全的十大排序算法详解(完整版代码)”这篇文章,下面是详细的攻略: 标题 首先,该文章的标题是:可能是你看过最全的十大排序算法详解(完整版代码) 文章简介 其次,在文章简介中,作者提到该篇文章是一个完整介绍了十大排序算法并且附有代码实现的文章,可以帮助读者了解这些排序算法的原理和代码实现。 内容 文章的主体部分是对十大排序算法进行详细的讲解…

    算法与数据结构 2023年5月19日
    00
  • Golang排列组合算法问题之全排列实现方法

    下面是对于“Golang排列组合算法问题之全排列实现方法”的完整攻略: Golang排列组合算法问题之全排列实现方法 什么是全排列 全排列,即在一组数的排列中,若任意两个数的位置不同,则称它们的排列是不同的。要求多少个不同的排列数,通常用全排列求解。 全排列实现方法 全排列的实现方式可以采用递归或迭代的方式。 递归实现方式 递归的思想是每次确定一个位置的数字…

    算法与数据结构 2023年5月19日
    00
  • C++中二叉堆排序详解

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

    算法与数据结构 2023年5月19日
    00
  • php实现的常见排序算法汇总

    PHP实现的常见排序算法汇总 本文主要介绍几种PHP实现常见排序算法的方法,帮助读者快速了解和使用这些排序算法。 排序算法是计算机编程领域中非常重要的基础算法之一,可以用于对数据进行排序,常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序等,本文将介绍其中的三种算法。 冒泡排序 冒泡排序是一种简单直观的排序算法,通过比较相邻元素的大小,将较大的元素逐个…

    算法与数据结构 2023年5月19日
    00
  • Golang算法问题之数组按指定规则排序的方法分析

    下面是“Golang算法问题之数组按指定规则排序的方法分析”的完整攻略: 前言 数组排序是算法问题的一个经典案例,今天将介绍如何使用 Go 语言对数组按照指定规则排序的方法。 算法分析 冒泡排序 冒泡排序是一种非常经典的排序算法,其基本思想是重复地走访过要排序的元素列,每次比较相邻的两个元素,如果它们的顺序错误就交换它们的位置。具体实现方式如下: func …

    算法与数据结构 2023年5月19日
    00
  • PHP冒泡排序算法代码详细解读

    PHP冒泡排序算法代码详细解读 什么是冒泡排序? 冒泡排序是一种简单的排序算法,通过交换相邻元素比较和交换的方式进行排序。该算法会重复遍历待排序的数列,每次比较相邻的两个元素,如果顺序错误就交换位置。重复执行这个过程,直到整个数列有序。 算法实现过程 以下是基于PHP语言实现的冒泡排序代码,对应的注释为算法的实现过程说明。 function bubbleSo…

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