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

yizhihongxing

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日

相关文章

  • JS中数组随机排序实现方法(原地算法sort/shuffle算法)

    JS中实现数组随机排序有两种常见方法:原地随机排序算法和使用shuffle算法。 原地随机排序算法 原地随机排序算法(in-place shuffle algorithm)是将数组中元素随机地乱序,同时保持每个元素之间的相对位置不变。算法的时间复杂度是O(n),空间复杂度是O(1),因为所有的操作都是在原数组上进行。 实现步骤 获取数组长度 从数组的最后一个…

    算法与数据结构 2023年5月19日
    00
  • 分布式架构Redis中有哪些数据结构及底层实现原理

    分布式架构Redis中有哪些数据结构及底层实现原理 Redis支持的数据结构包括:字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。 字符串(String) 字符串是Redis最基础的数据类型,与Java中的String类似,适用于存储任意二进制数据,可以存储字符串、数字、二进制数据等类型的数据。…

    算法与数据结构 2023年5月19日
    00
  • 利用JavaScript实现的10种排序算法总结

    作为“利用JavaScript实现的10种排序算法总结”的作者,首先需要明确以下内容: 熟悉10种排序算法的原理与流程 理解JavaScript作为一门编程语言的特点和应用场景 知道如何将算法的流程用JavaScript代码实现 针对以上内容,可以采取以下步骤: 梳理10种排序算法的流程和实现方式,用markdown文本形式编写对应的标题和文本,例如: 插入…

    算法与数据结构 2023年5月19日
    00
  • JS排序之冒泡排序详解

    JS排序之冒泡排序详解 简介 冒泡排序是最基本,也是最容易实现的排序算法之一。它的基本思想是通过多次循环遍历数组,每次比较相邻两个元素的大小,如果发现顺序不对,就交换它们的位置,通过多次遍历和交换的操作,最终使得整个数组变得有序。 基本思路 遍历数组,将相邻元素的大小进行比较,如果前面元素大于后面元素,则交换它们的位置; 继续以相同的方式遍历数组,直到数组中…

    算法与数据结构 2023年5月19日
    00
  • C语言库函数qsort及bsearch快速排序算法使用解析

    这里是关于C语言库函数qsort及bsearch快速排序算法使用的详细攻略。 qsort排序函数 1. 定义 qsort是C语言标准库中快速排序算法的一个实现函数。它用于对一个数组中的元素进行排序。qsort函数的定义如下: void qsort(void* base, size_t nitems, size_t size, int (*compar)(co…

    算法与数据结构 2023年5月19日
    00
  • C++中的几种排序算法

    下面就C++中几种常用的排序算法进行详细的讲解。 一、冒泡排序 冒泡排序是一种基本排序算法,也是入门级别的排序算法。其基本思想就是对于一组待排序的数据,通过不断地比较相邻两个元素的大小关系,并对需要调整位置的元素进行交换,来达到排序的目的。 C++代码实现: void bubble_sort(int arr[], int n) { for (int i = …

    算法与数据结构 2023年5月19日
    00
  • 简单掌握桶排序算法及C++版的代码实现

    简单掌握桶排序算法及C++版的代码实现 什么是桶排序? 桶排序(Bucket Sort)是一种常见的排序算法,它将数组中的元素分组至有限数量的桶中。每一个桶都可以视为一小部分数据的集合。根据桶内的元素所构成的数据的大小关系,可以在每个桶内部再分别使用其他排序算法或者递归地进行桶排序。最后,所有的桶按照顺序依次输出,即可得到有序序列。 桶排序算法的时间复杂度 …

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

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

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