冒泡排序是一种简单的排序算法,在JavaScript中实现它可以帮助我们理解基础算法的逻辑,也是很多面试中的常考知识点。下面我们就来一步步学习如何在JavaScript中实现冒泡排序。

冒泡排序的基本原理
冒泡排序的核心逻辑是重复遍历要排序的数组,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。遍历数组的工作会重复执行,直到没有需要交换的元素为止,此时数组已经完成排序。
每一轮遍历都会让当前未排序部分中最大的元素移动到末尾,就像气泡往上浮一样,因此得名冒泡排序。
基础版冒泡排序实现
下面是未做任何优化的基础版冒泡排序JavaScript实现:
// 基础版冒泡排序函数
function bubbleSort(arr) {
// 外层循环控制遍历的轮数,共需要arr.length-1轮
for (let i = 0; i < arr.length - 1; i++) {
// 内层循环控制每轮相邻元素的比较和交换
// 每轮结束后,末尾i个元素已经是排好序的最大元素,不需要再比较
for (let j = 0; j < arr.length - 1 - i; j++) {
// 如果当前元素大于下一个元素,交换它们的位置
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
// 测试用例
let testArr = [5, 3, 8, 4, 2];
console.log("排序前:", testArr);
console.log("排序后:", bubbleSort(testArr));优化版冒泡排序实现
基础版的冒泡排序即使数组已经有序,也会执行完所有轮次的循环,我们可以增加一个标志位,如果某一轮没有发生任何交换,说明数组已经有序,直接结束排序即可,减少不必要的比较。
// 优化版冒泡排序函数
function optimizedBubbleSort(arr) {
let hasSwapped;
// 外层循环控制遍历轮数
for (let i = 0; i < arr.length - 1; i++) {
hasSwapped = false;
// 内层循环比较相邻元素
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
hasSwapped = true;
}
}
// 如果本轮没有发生交换,说明数组已经有序,直接退出循环
if (!hasSwapped) {
break;
}
}
return arr;
}
// 测试用例
let testArr2 = [1, 2, 3, 4, 5];
console.log("排序前:", testArr2);
console.log("排序后:", optimizedBubbleSort(testArr2));冒泡排序的特性分析
我们可以通过下面的表格来了解冒泡排序的相关特性:
| 特性项 | 说明 |
|---|---|
| 时间复杂度(最好情况) | 数组已经有序时,优化版为O(n),基础版为O(n²) |
| 时间复杂度(最坏情况) | 数组完全逆序时,为O(n²) |
| 时间复杂度(平均情况) | O(n²) |
| 空间复杂度 | O(1),属于原地排序算法 |
| 稳定性 | 稳定排序,相等元素的相对位置不会改变 |
使用场景说明
冒泡排序的时间复杂度较高,在处理大规模数据时不建议使用,更适合用于以下场景:
- 学习基础排序算法的逻辑,理解算法的基本思想
- 处理小规模、近乎有序的数组排序需求
- 面试中考察基础算法实现能力
如果实际开发中需要对大规模数组排序,建议使用JavaScript内置的Array.prototype.sort()方法,它的实现通常更高效,不同浏览器的引擎会有不同的优化实现。
JavaScript冒泡排序数组排序算法实现修改时间:2026-05-29 23:33:08