js实现冒泡排序

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FuncPlotCalc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值