js实现冒泡排序
以下是使用 JavaScript 实现冒泡排序的示例代码。冒泡排序是一种简单的排序算法,通过重复比较相邻元素并交换顺序错误的元素,将较大的元素“冒泡”到数组的末端。虽然它的时间复杂度为 O(n²),在小规模数据集上效果尚可,但对于大规模数据集效率较低。
冒泡排序的 JavaScript 实现
/**
* 冒泡排序算法
* @param {number[]} arr - 待排序的数组
* @returns {number[]} - 排序后的数组
*/
function bubbleSort(arr) {
const n = arr.length;
let swapped;
// 外层循环控制所有的遍历次数
for (let i = 0; i < n - 1; i++) {
swapped = false;
// 内层循环进行相邻元素的比较和交换
for (let j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 交换元素
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
// 如果在某次遍历中没有发生交换,说明数组已经有序
if (!swapped) {
break;
}
}
return arr;
}
// 示例使用
const array = [64, 34, 25, 12, 22, 11, 90];
console.log("原始数组:", array);
const sortedArray = bubbleSort(array);
console.log("排序后的数组:", sortedArray);
代码解释
函数定义: bubbleSort 函数接受一个数字数组 arr 作为参数,并返回排序后的数组。
变量初始化:
n 是数组的长度。
swapped 是一个布尔值,用于跟踪在一次完整的内层遍历中是否发生了元素交换。如果在某次遍历中没有发生交换,说明数组已经有序,可以提前终止排序。
外层循环 (for (let i = 0; i < n - 1; i++)):
控制需要进行的遍历次数。每完成一次外层循环,最大的未排序元素就“冒泡”到数组的末尾,因此内层循环的范围可以逐渐减少。
内层循环 (for (let j = 0; j < n - 1 - i; j++)):
对相邻的元素进行比较,如果前一个元素比后一个元素大,则交换它们的位置。
交换操作:
使用临时变量 temp 来交换 arr[j] 和 arr[j + 1] 的值。
优化:
使用 swapped 标志。如果在某次外层循环中没有发生任何交换,说明数组已经有序,可以使用 break 提前结束排序,减少不必要的遍历。
示例:
定义一个未排序的数组 array,然后调用 bubbleSort 函数对其排序,并输出排序前后的结果。
输出结果
原始数组: [ 64, 34, 25, 12, 22, 11, 90 ]
排序后的数组: [ 11, 12, 22, 25, 34, 64, 90 ]
性能分析
时间复杂度:
最佳情况(已排序):O(n)
平均和最坏情况:O(n²)
空间复杂度: O(1),因为排序是原地进行的,没有使用额外的存储空间。
稳定性: 冒泡排序是稳定的排序算法,因为相等的元素不会交换位置。
虽然冒泡排序在理论和实践中并不是最高效的排序算法,但由于其简单性,常用于教学目的以及对小型数据集的简单排序需求。
该博文为原创文章,未经博主同意不得转载。本文章博客地址:https://pythonking.blog.csdn.net/article/details/144963758