js 基础排序算法 之 冒泡排序, 选择排序, 插入排序,快速排序

简介: js 基础排序算法 之 冒泡排序, 选择排序, 插入排序,快速排序

排序算法


排序算法没有优劣之分,在不同的场景中,不同的排序算法执行效率不同。


1.选择排序 Selection Sort


一次选择排序,可以将某个区间的最小值排列到该区域的第一位,具体的方式是:


1.找出该区域的最小值

2.将该值与该区域第一个值交换

3.对下一个区域重复上述过程,直到排序完成


let arr = [3, 2, 4, 6, 7, 9, 3, 1, 4];
/**
 * 选择排序
 * @param asc {Boolean} 是否升序
 * @returns {Array}
 */
Array.prototype.chooseSort = function (asc = true) {
    if (this.length < 1) return this;
    // 选择排序以升序为例: 从左侧选择一个值的索引进行对比,如果值大,那么交换索引,每一圈拿一个最大的索引,然后通过索引来交换位置
    for (let i = 0, l = this.length; i < l; i++) {
        let index = 0; // 获取一个索引,然后通过索引的值来进行对比
        for (let j = 1, jl = l - i; j < jl; j++) {
            if (asc && this[j] > this[index]) {
                index = j;
            } else if (!asc && this[j] < this[index]) {
                index = j;
            }
        }
        // 进行交换位置,每一圈拿一个最大或者最小值和数组最右边的一位交换
        [this[index], this[l - i - 1]] = [this[l - i - 1], this[index]]
    }
    return this;
}
// console.log(arr.chooseSort());
console.time('选择排序用时')
console.log(arr.chooseSort());
console.log(arr.chooseSort(false));
console.timeEnd('选择排序用时')


2.冒泡排序 Bubble Sort


一次冒泡排序,可以将某个区域序列的最大值排序到该区域的最后一位,具体的方式是:


1.将第1位和第2位比较,如果前者比后者大则交换

2.将第2位和第3位比较,如果前者比后者大则交换

3.依次类推,直到比较到该区域的最后两位

4.重复上述过程,直到序列排序完成


let arr = [3, 2, 4, 6, 7, 9, 3, 1, 4];
/**
 * 冒泡排序
 * @param asc {Boolean} 是否升序
 * @returns {Array}
 */
Array.prototype.bubbleSort = function (asc = true) {
    if (this.length < 1) return this;
    // 快速排序以升序为例,每一次选择前两个进行比较,大的放在前面,小的放后面,每一圈拿一个最大值,
    for (let i = 0, l = this.length; i < l; i++) {
        for (let j = 1, jl = l - i; j < jl; j++) {
            if (asc && this[j - 1] > this[j]) {
                // 交换位置
                [this[j - 1], this[j]] = [this[j], this[j - 1]]
            } else if (!asc && this[j - 1] < this[j]) {
                [this[j - 1], this[j]] = [this[j], this[j - 1]]
            }
        }
    }
    return this;
}
console.time('冒泡排序用时')
console.log(arr.bubbleSort());
console.log(arr.bubbleSort(false));
console.timeEnd('冒泡排序用时')


3.插入排序 Insertion Sort


将序列分为两个部分,一部分是有序的,一部分是无序的,现在要做的是,就是不断的从无序的部分取出数据,加入到有序的部分,直到整个排序完成


例如:序列[5, 7, 2, 3, 6]


1.分为有序的序列和无序的序列 (5) (7 2 3 6)

2.不断的扩充有序序列 (5 7) (2 3 6)

3.不断的扩充有序序列 (2 5 7) (3 6)

4.不断的扩充有序序列 (2 3 5 7) (6)

5.不断的扩充有序序列 (2 3 5 6 7)

6.排序完成


let arr = [3, 2, 4, 6, 7, 9, 3, 1, 4];
/**
 * 插入排序
 * @param asc {Boolean} 是否升序
 * @returns {Array}
 */
Array.prototype.insertionSort = function (asc = true) {
    if (this.length < 1) return this;
    // 插值排序以升序为例:把数据分为两个部分,先从无序部分取出数据到有序那部分进行排序
    for (let i = 1, l = this.length; i < l; i++) {
        // 获取第一位的数据, 如果不满足排序条件,需要插入到对应的位置
        if (asc && this[i] < this[i - 1]) {
            let temp = this[i];
            // 把后面的这一位需要排到前面的合适位置
            for (let j = i; j >= 0; j--) {
                if (j > 0 && this[j - 1] > temp) {
                    this[j] = this[j - 1];
                } else {
                    this[j] = temp;
                    break
                }
            }
        } else if (!asc && this[i] > this[i - 1]) {
            let temp = this[i];
            for (let j = i; j >= 0; j--) {
                if (j > 0 && this[j - 1] < temp) {
                    this[j] = this[j - 1];
                } else {
                    this[j] = temp;
                    break;
                }
            }
        }
    }
    return this;
}
// console.log(arr.insertionSort(false));
console.time('插入排序用时')
console.log(arr.insertionSort());
console.log(arr.insertionSort(false));
console.timeEnd('插入排序用时')


4.快速排序 Quick Sort


选择一个数(比如序列的最后一位)作为基准数,将整个序列排序成两部分,一部分比该数小,另一部分比该数大,基准数在中间,然后对剩余的序列做同样的事情,直到排序完成


例如:序列[5, 7, 2, 3, 6, 4]


1.选择4作为基准数,排序成为:(3, 2) 4 (7, 6, 5)

2.对于3,2, 继续使用该方式排序,得到: (2, 3) 4 (7,6,5)

3.对于7,6,5,继续使用该方式排序,得到: (2, 3) 4 (5,6,7)

4.排序完成


let arr = [3, 2, 4, 6, 7, 9, 3, 1, 4];
// 快速排序
/**
 * 快速排序
 * @param asc {Boolean} 是否升序
 * @returns {Array}
 */
Array.prototype.quickSort = function (asc = true) {
    if (this.length < 1) return this;
    // 快速排序:以升序为例, 获取中间的一个基线, 分为两边,小的在左,大的在右边, 左右两边继续选基线排序
    function __quickSort(arr, start, end) {
        if (start >= end || start >= arr.length - 1) return arr;
        let low = start, high = end, key = arr[end];
        while (low < high) {
            // 升序,
            if (asc) {
                // 地位小于高位 并且 当前的值小于基线
                while (low < high && arr[low] <= key) low++;
                // 否则当前地位不动,移动并且把当前低位指向的值赋值给高位
                arr[high] = arr[low];
                // 移动高位
                while (low < high && arr[high] > key) high--;
                // 否在赋值给低位,从新移动低位指针
                arr[low] = arr[high];
            } else {
                // 降序
                while (low < high && arr[low] >= key) low++;
                arr[high] = arr[low];
                while (low < high && arr[high] < key) high--;
                arr[low] = arr[high];
            }
        }
        // low === high,当两根指针重合, 把中间的值赋值
        arr[high] = key;
        __quickSort(arr, start, low - 1);
        __quickSort(arr, low + 1, end)
    }
    __quickSort(this, 0, this.length - 1);
    return this;
}
// console.log(arr.quickSort(false));
console.time('快速排序用时')
console.log(arr.quickSort());
console.log(arr.quickSort(false));
console.timeEnd('快速排序用时')


结果如下:


[
1, 2, 3, 3, 4,
4, 6, 7, 9
]
[
9, 7, 6, 4, 4,
3, 3, 2, 1
]
冒泡排序用时: 11.315ms
[
1, 2, 3, 3, 4,
4, 6, 7, 9
]
[
9, 7, 6, 4, 4,
3, 3, 2, 1
]
选择排序用时: 0.473ms
[
1, 2, 3, 3, 4,
4, 6, 7, 9
]
[
9, 7, 6, 4, 4,
3, 3, 2, 1
]
插入排序用时: 0.359ms
[
1, 2, 3, 3, 4,
4, 6, 7, 9
]
[
9, 7, 6, 4, 4,
3, 3, 2, 1
]
快速排序用时: 0.415ms


目录
打赏
0
0
0
0
15
分享
相关文章
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
117 4
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
171 67
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
163 61
冒泡排序算法
【10月更文挑战第19天】冒泡排序是一种基础的排序算法,虽然在实际应用中可能不是最优的选择,但对于理解排序算法的基本原理和过程具有重要意义。
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
本程序基于免疫算法实现物流仓储点选址优化,并通过MATLAB 2022A仿真展示结果。核心代码包括收敛曲线绘制、最优派送路线规划及可视化。算法模拟生物免疫系统,通过多样性生成、亲和力评价、选择、克隆、变异和抑制机制,高效搜索最优解。解决了物流仓储点选址这一复杂多目标优化问题,显著提升物流效率与服务质量。附完整无水印运行结果图示。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
基于GA遗传算法的斜拉桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现斜拉桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率ηq(0.95≤ηq≤1.05)的要求,目标是使ηq尽量接近1,同时减少加载车辆数量和布载耗时。程序通过迭代优化计算车辆位置、方向、类型及占用车道等参数,并展示适应度值收敛过程。测试版本为MATLAB2022A,包含核心代码与运行结果展示。优化模型综合考虑车辆总重量、间距及桥梁允许载荷密度等约束条件,确保布载方案科学合理。
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
本程序基于ECC(椭圆曲线密码学)簇内分组密钥管理算法,对无线传感器网络(WSN)进行MATLAB性能仿真。通过对比网络通信开销、存活节点数量、网络能耗及数据通信量四个关键指标,验证算法的高效性和安全性。程序在MATLAB 2022A版本下运行,结果无水印展示。算法通过将WSN划分为多个簇,利用ECC生成和分发密钥,降低计算与通信成本,适用于资源受限的传感器网络场景,确保数据保密性和完整性。
基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于遗传算法优化的时间卷积神经网络(TCN)用于时间序列预测的方法。算法运行于 Matlab2022a,完整程序无水印,附带核心代码、中文注释及操作视频。TCN通过因果卷积层与残差连接学习时间序列复杂特征,但其性能依赖超参数设置。遗传算法通过对种群迭代优化,确定最佳超参数组合,提升预测精度。此方法适用于金融、气象等领域,实现更准确可靠的未来趋势预测。
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等