返回

前端面试必备:揭秘选择、桶、冒泡和快速排序

前端

新年伊始,又到了金三银四的时候了。随着前端技术的发展,算法面试题也变得越来越常见。为了帮助大家应对面试,我将在这篇文章中介绍四种常见的数组排序算法:选择排序、桶排序、冒泡排序和快速排序,并分析它们的优劣势。

选择排序

选择排序是一种简单的排序算法,通过遍历数组,选择出当前遍历位置之后的最小的元素,并将其交换到当前位置。重复该过程,直到整个数组排序完毕。

优点:

  • 实现简单
  • 稳定排序(即具有相同值的元素保持相对顺序)

缺点:

  • 效率低,时间复杂度为 O(n²),不适合处理大型数组
  • 空间复杂度为 O(1)

桶排序

桶排序是一种非比较排序算法,将数组中的元素分配到预先定义的桶中,每个桶代表一个特定的范围。然后,对每个桶中的元素进行排序,最后将所有桶中的元素连接起来得到最终的排序数组。

优点:

  • 效率高,时间复杂度为 O(n + k),其中 k 是桶的数量
  • 适用于处理分布均匀的数据

缺点:

  • 要求预先知道数据的范围
  • 空间复杂度为 O(n + k)

冒泡排序

冒泡排序是一种简单的排序算法,通过反复比较相邻元素,将较大的元素“泡”到数组的后面。重复该过程,直到数组排序完毕。

优点:

  • 实现简单
  • 稳定排序

缺点:

  • 效率低,时间复杂度为 O(n²),不适合处理大型数组
  • 空间复杂度为 O(1)

快速排序

快速排序是一种高效的排序算法,使用“分治”策略。通过选择一个基准元素,将数组分为两个子数组:小于基准元素的元素和大于基准元素的元素。然后,对两个子数组递归地应用快速排序。

优点:

  • 效率高,平均时间复杂度为 O(n log n)
  • 不稳定排序

缺点:

  • 实现相对复杂
  • 空间复杂度为 O(log n)

在 JavaScript 中的应用

以下是在 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 (minIndex !== i) {
      [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
    }
  }
  return arr;
}

// 桶排序
function bucketSort(arr, min, max) {
  const bucketSize = Math.floor((max - min) / 5);
  const buckets = new Array(5);
  for (let i = 0; i < buckets.length; i++) {
    buckets[i] = [];
  }
  for (let i = 0; i < arr.length; i++) {
    const bucketIndex = Math.floor((arr[i] - min) / bucketSize);
    buckets[bucketIndex].push(arr[i]);
  }
  for (let i = 0; i < buckets.length; i++) {
    buckets[i].sort((a, b) => a - b);
  }
  const sortedArray = [];
  for (let i = 0; i < buckets.length; i++) {
    sortedArray.push(...buckets[i]);
  }
  return sortedArray;
}

// 冒泡排序
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]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

// 快速排序
function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  const pivot = arr[Math.floor(Math.random() * arr.length)];
  const left = [];
  const right = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else if (arr[i] > pivot) {
      right.push(arr[i]);
    }
  }
  return [...quickSort(left), pivot, ...quickSort(right)];
}

希望这篇文章能帮助您深入理解这四种排序算法,并为您的面试准备提供帮助。