关闭

原生js实现冒泡排序算法,javascript冒泡排序

时间: 2017-11-17阅读: 2223标签: 算法

冒泡排序是一个非常常见的排序算法,对于一个数组,每趟排序时依次比较两个相邻的数,如果他们的顺序错误就交换两数位置。所以,没趟排序都会排好一个数字,下一轮排序就可以少比较一个数字,直到只剩下一个数字,就全部排序好了。

举个例子,假设最终需要的结果是从小到大排列,对于数组:

[3, 5, 2, 6, 1, 7, 4]

第一趟排序的过程:

[3, 5, 2, 6, 1, 7, 4]

// 比较过程:
// 1. 比较 3 和 5,发现顺序正确,则不变
[3, 5, 2, 6, 1, 7, 4]

// 2. 比较 5 和 2,发现顺序错误,交换位置
[3, 2, 5, 6, 1, 7, 4]

// 3. 比较 5 和 6,发现顺序正确,不变
[3, 2, 5, 6, 1, 7, 4]

// 4. 比较 6 和 1,发现顺序错误,交换位置
[3, 2, 5, 1, 6, 7, 4]

// 5. 比较 6 和 7,发现顺序正确,不变
[3, 2, 5, 1, 6, 7, 4]

// 5. 比较 7 和 4,发现顺序错误,交换位置
[3, 2, 5, 1, 6, 4, 7]

排序过程中,所有相邻数字对都比较了一遍,比较的过程中,实质上是比较的相邻位置,而不管位置上的数字是否在上一次比较中交换了位置,只管一个一个位置的比较下去,数字顺序错误就把数字位置交换。经过这趟排序,发现最大的数字 7 已经排到了最后一个位置,所以下一趟排序就不需要再比较最后一个位置的数字了。

第二趟排序过程:

// 经过第一趟排序后的数组
[3, 2, 5, 1, 6, 4, 7]

// 比较过程:
// 1. 比较 3 和 2,发现顺序错误,交换位置
[2, 3, 5, 1, 6, 4, 7]

// 2. 比较 3 和 5,发现顺序正确,不变
[2, 3, 5, 1, 6, 4, 7]

// 3. 比较 5 和 1,发现顺序错误,交换位置
[2, 3, 1, 5, 6, 4, 7]

// 4. 比较 5 和 6,发现顺序正确,不变
[2, 3, 1, 5, 6, 4, 7]

// 5. 比较 6 和 4,发现顺序错误,交换位置
[2, 3, 1, 5, 4, 6, 7]

// 最后一个数字不用比较

经过第二趟排序后,数字 6 也排到了正确的位置。第三趟排序时,最后两位数字都不用比较了。

每一趟排序,都会把剩余数字中最大的排到最后面。后面的排序过程就不再分析了。清楚了排序过程,写代码来排序就很简单了,代码如下:

function bubbleSort(arr) {
    var arr = arr.slice(0); // 保证排序后原数组不变
    var len = arr.length;
    var tmp;

    // 只需要进行 len - 1 趟排序
    // 因为只剩下一个数字时不用再比较了
    for (var i = 0; i < len - 1; ++i) {

        // 每一趟都会排序好一个数字
        // 所以每趟只需排 len - i 个数字
        for (var j = 1; j < len - i; ++j) {

            // 如果右边的数比左边的小
            // 就交换位置
            if (arr[j] < arr[j-1]) {
                tmp = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = tmp;
            }
        }

        // 这里可以打印出每趟排序的结果
        // 以便观察排序过程
        // console.log(arr);
    }

    return arr;
}
站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/121

原生JS找出所有的水仙花数

一个三位的整数,个、十、百的立方和等于该整数(例:153=1*1*1+5*5*5+3*3*3),步骤构思:1、依次循环遍历输出所有三位数,取整,2、设置条件判断

数据结构与算法之绪论

什么是数据结构?简单来说可以解释为:程序设计=数据结构+算法;主要是用来研究数据结构的关系,数据元素之间存在的一种或多种特定关系的集合;

简单理解梯度下降算法及js实现

看了很多文章,梯度下降算法描述都比较艰涩难懂,比如说: 目标函数f(θ)关于参数θ的梯度将是损失函数(loss function)上升最快的方向。然后会推导出下面这个公式。

Js算法模式:动态规划和贪心算法

动态规划(Dynamic Programming,DP)是一种将复杂问题分解成更小的子问题来解决的优化算法。下面有一些用动态规划来解决实际问题的算法:给定一组硬币的面额,以及要找零的钱数,计算出符合找零钱数的最少硬币数量。

用js在控制台打印九九乘法表

不管是打印什么样三角形九九乘法表,我们都应该找到有规律的地方,比如第一列的数字是什么规律,第一行的数字是什么规律,只要找到了共性,九九乘法表就很简单

如何用 JS 实现二叉堆

二叉树(Binary Tree)是一种树形结构,它的特点是每个节点最多只有两个分支节点,一棵二叉树通常由根节点、分支节点、叶子节点组成,如下图所示

Vue2.x的diff算法记录

为什么在Vue3.0都已经出来这么久了我还要写这篇文章,因为目前自己还在阅读Vue2.x的源码,感觉有所悟。作为一个刚毕业的新人,对Vue框架的整体设计和架构突然有了一点认知,所以才没头没尾地突然写下了diff算法。

给一个数字,输出人民币组合(JavaScript算法)

人民币由100元,50元,20元10元,5元1元,5毛,1毛面额组合。写一个方法随便传入一个数字参数,就输出人民币组合。

js实现1万的阶乘

但是这样就会存在问题,Js中最大的安全整数为2^53- 1,10000!结果溢出该范围,代码运行结果为Infinity,无法计算出正确的结果。那么如何才能计算大数据的阶乘呢?

js中常用的基础算法

今天给大家分享一下js中常用的基础算法,废话不多说,直接上代码;两个数字调换顺序;对象排序,安装对象中的id排序对象的位置;冒泡排序 ;随机出现不同的数字;字符串大小写互换

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!