返回
前端面试必备:揭秘选择、桶、冒泡和快速排序
前端
2023-09-26 12:46:17
新年伊始,又到了金三银四的时候了。随着前端技术的发展,算法面试题也变得越来越常见。为了帮助大家应对面试,我将在这篇文章中介绍四种常见的数组排序算法:选择排序、桶排序、冒泡排序和快速排序,并分析它们的优劣势。
选择排序
选择排序是一种简单的排序算法,通过遍历数组,选择出当前遍历位置之后的最小的元素,并将其交换到当前位置。重复该过程,直到整个数组排序完毕。
优点:
- 实现简单
- 稳定排序(即具有相同值的元素保持相对顺序)
缺点:
- 效率低,时间复杂度为 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)];
}
希望这篇文章能帮助您深入理解这四种排序算法,并为您的面试准备提供帮助。