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


相关文章
|
2月前
|
存储 监控 算法
局域网监控其他电脑的设备信息管理 Node.js 跳表算法
跳表通过分层索引实现O(logn)的高效查询、插入与删除,适配局域网监控中设备动态接入、IP映射及范围筛选等需求,相比传统结构更高效稳定,适用于Node.js环境下的实时设备管理。
125 9
|
4月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
209 0
|
2月前
|
存储 监控 JavaScript
企业上网监控系统的恶意 URL 过滤 Node.js 布隆过滤器算法
布隆过滤器以低内存、高效率特性,解决企业上网监控系统对百万级恶意URL实时检测与动态更新的难题,通过概率性判断实现毫秒级过滤,内存占用降低96%,适配大规模场景需求。
249 3
|
2月前
|
存储 监控 算法
电脑管控软件的进程优先级调度:Node.js 红黑树算法
红黑树凭借O(log n)高效插入、删除与查询特性,适配电脑管控软件对进程优先级动态调度的高并发需求。其自平衡机制保障系统稳定,低内存占用满足轻量化部署,显著优于传统数组或链表方案,是实现关键进程资源优先分配的理想选择。
164 1
|
3月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
247 3
|
5月前
|
搜索推荐 算法 Go
Go语言数组排序(冒泡排序法)—— 用最直观的方式掌握排序算法
本案例介绍使用冒泡排序对整数数组进行升序排序的实现方法,涵盖输入处理、错误检查与排序逻辑。通过代码演示和算法解析,帮助理解排序原理及Go语言切片操作,为学习更复杂排序算法打下基础。
|
5月前
|
搜索推荐
冒泡排序与其它排序算法比较
本内容比较了冒泡排序、选择排序和插入排序的特性。三者时间复杂度均为O(n²),但交换次数和稳定性不同。冒泡排序稳定,交换次数多,可优化至O(n);选择排序不稳定,交换次数少;插入排序交换次数最少,且二者均为稳定排序。对于有序数组,冒泡和插入可优化提升效率。
113 0
|
7月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
197 4
|
7月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
193 3
|
7月前
|
存储 监控 算法
公司内部网络监控中的二叉搜索树算法:基于 Node.js 的实时设备状态管理
在数字化办公生态系统中,公司内部网络监控已成为企业信息安全管理体系的核心构成要素。随着局域网内终端设备数量呈指数级增长,实现设备状态的实时追踪与异常节点的快速定位,已成为亟待解决的关键技术难题。传统线性数据结构在处理动态更新的设备信息时,存在检索效率低下的固有缺陷;而树形数据结构因其天然的分层特性与高效的检索机制,逐渐成为网络监控领域的研究热点。本文以二叉搜索树(Binary Search Tree, BST)作为研究对象,系统探讨其在公司内部网络监控场景中的应用机制,并基于 Node.js 平台构建一套具备实时更新与快速查询功能的设备状态管理算法框架。
279 3

热门文章

最新文章