在我大学的时候,就已经接触到过很多的排序方式,只是那时候听得还很懵懂,大概知道这么个东西,也对冒泡排序有点印象,但真要我写,我是写不出来的。最近,在回顾js基础的时候,又接触到了冒泡排序。于是,就把冒泡排序又仔细的研究了一遍,以下是我个人的理解。

在讲冒泡排序之前,首先要知道的就是冒泡排序的原理。

说的简单点,冒泡排序就是数组每中两个相邻的数字进行比较,如果后面的数字比前面的数字小,那么就让这两个数字交换位置,比如:

arr=[5,3];

数组中有两个数值,前面的数比后面的数大,就让他们两个交换位置,数组就变成了

arr=[3,5];

这是最简单版本的,那么三个数字的时候呢,

arr=[5,3,1];

这时候就让第一个数字5跟第二个数字3比较,5比3大,所以5跟3调换位置,数组就变成了

arr=[3,5,1];

这时候再让第二个数字5跟第三个数字1比较,5比较大,所以5跟1调换位置,数组就变成了

arr=[3,1,5];

这样,一轮循环就就行完了,此时,最大的数已经被排序到了最后,很明显,数组还没有排序完成,所以就要进行第二轮循环

再让第一个数字3跟第二个数字1进行比较,3比较大,所以3跟1调换位置,数组就变成了

arr=[1,3,5];

这个时候,重点就到了,要不要再把第二个数字跟最后一个数字进行比较,这里我说最后一个数字而不是第三个数字,就是因为在第一次排序的时候,已经排序出了最大的那个数字,并且放在了最后,所以就不用在拿倒数第二个数字跟最后一个数字比较了。

所以,继续给数组增加内容,变成一个含有n个值得数组,

让第一个数字跟第二个数字进行比较,如果第一个数字比第二个大,就让两个数字交换位置,然后再让第二个数字跟第三个数字进行比较,如果第二个数字比第三个数字小,那就不做任何改变,继续让第三个数字跟第四个数字比较,一直到第n-1个数字,此时,第n-1个数肯定是之前数字中最大的,再拿n-1跟n比较,如果n-1大于n,那么n-1就跟n交换位置,如果n-1小于n,那么这两个数的位置不变,此时,n就是 数组中最大的那个数,并且放在了数组的最后面。第一轮循环结束。

然后进入第二轮循环,重复第一轮的过程,直到n-2这个数,同上,n-2肯定是之前数字中最大的。拿n-2跟n-1比较,如果n-2大于n-1,那么n-2就跟n-1交换位置,否则的话n-1跟n-2的位置不变,此时n-1就是数组中第二大的数,并且放在数组的倒数第二个位置,第二轮循环结束。

重复这样的循环,直到排到第一个数跟第二个数为止,这样,整个数组就肯定是从小到大的排列了。不过,这样子的排序并不是一定要排到第一个数字跟第二个数字为止,因为,有可能排完中间某两个数之后,数组就已经是按照从小到大的排列了。比如:

原来的数组是这样的

arr=[1,2,4,5,3];

在经过第一轮冒泡排序之后,数组就变成了

arr=[1,2,4,3,5];

然后数组进入第二轮冒泡排序,数组就变成了

arr=[1,2,3,4,5];

很明显,数组已经排序完成了,此时,但是按照之前说的,数组还会继续排序。这样,会很消耗系统的资源,所以我们要设置一个标志,来控制循环的结束。如果一轮循环中,没有任何两个数字交换位置,就意味着数组已经排序完成了,就没有必要再进行之后的排序了。这样,我们就可以减少排序的次数,加快排序的时间,减少系统资源的消耗。

其实,冒泡排序在写的时候并没有那么难,主要就是三点。首先,就是要用一层循环来控制循环的次数,其次,再用一层循环来给相邻两个数字做比较,最后,要设置一个标志,来控制循环的时间复杂度,从而减少没必要的循环。

下图是一个用函数封装的关于冒泡排序的代码。

就这样,冒泡排序就完了,只要了解冒泡排序的原理,然后再按着思路自己写写看,冒泡排序其实也不是那么难。

JavaScript中冒泡排序的更多相关文章

  1. Javascript中,实现十大排序方法之一(冒泡排序及其优化设想)

    冒泡排序的Javascript实现 首先定义一个取值范围在(0~100000)之间的随机值的长度为10万的数组, function bubbleSort(arr) { console.time('冒泡 ...

  2. JavaScript实现冒泡排序、快速排序、插入排序

    JavaScript实现冒泡排序.快速排序.插入排序 时间:2014-01-09 18:05:51  来源:  作者:胡晗 冒泡排序的基本思想:所谓冒泡就是泡泡一个一个往上冒,让体积最轻的泡泡浮在最上 ...

  3. javascript中的sort()方法

    现在在学习javascript中,发现sort()函数是有点奇怪的东西(可能是本人水平的问题-_-!),于是就在这里记录一下自己找到的东西吧.sort()这个方法的参数很奇怪,必须是函数,但也是可选参 ...

  4. javascript的冒泡排序, 快速排序, 选择排序, 插入排序

    冒泡排序, 最经典的排序, 把比较大的数字往后放, 和选择排序恰恰相反: <!DOCTYPE html> <html lang="en"> <head ...

  5. JavaScript中简单排序总结

    JavaScript中简单排序总结 冒泡排序 经典排序算法, 双重for循环 在第二个for循环的时候, j < arr.len -1 -i , 这一步的优化很重要 function bullS ...

  6. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  7. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  8. JavaScript 中的数据类型

    Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...

  9. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

随机推荐

  1. js原生设计模式——7原型模式之真正的原型模式——对象复制封装

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  2. oc是一个全动态语言,oc的一切都是基于runtime实现的!

    oc是一个全动态语言,oc的一切都是基于runtime实现的! 从以下三方面来理解runtime吧! 1. 传统的面向过程的语言开发,例如c语言.实现c语言编译器很简单,只要按照语法规则实现一个LAL ...

  3. HTML 脚本

    JavaScript 使 HTML 页面具有更强的动态和交互性. 在线实例 插入一段脚本如何将脚本插入 HTML 文档. 使用 <noscript> 标签如何应对不支持脚本或禁用脚本的浏览 ...

  4. 如何让sql自动定时执行某个存储过程

    /*--创建作业--邹建 2003.10--*//*--调用示例--每月执行的作业exec p_createjob @jobname='mm',@sql='select * from syscolum ...

  5. easyUI parser的使用

    easyUI parser的使用: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  6. aix下java程序运行问题

    CLASSPATH=/track.jar:/standalone.jar export CLASSPATH nohup /usr/java6_64/bin/java com.TrackMain > ...

  7. Linux笔记(三) - 文件搜素

    (1)文件搜索:find-name  根据文件名, *匹配任意字符 ,?单个字符-iname  根据文件名, 不区分大小写-size 根据文件大小查找 (+ 大于 -小于)(-a并且 -o或者)-us ...

  8. HDU5879(打表)

    Cure Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. android 获取日期

    */ public static HashMap<String, String> computeDate(){ Calendar cal =Calendar.getInstance(); ...

  10. page cache 与free

    我们经常用free查看服务器的内存使用情况,而free中的输出却有些让人困惑,如下: 先看看各个数字的意义以及如何计算得到: free命令输出的第二行(Mem):这行分别显示了物理内存的总量(tota ...