JavaScript中冒泡排序
在我大学的时候,就已经接触到过很多的排序方式,只是那时候听得还很懵懂,大概知道这么个东西,也对冒泡排序有点印象,但真要我写,我是写不出来的。最近,在回顾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中冒泡排序的更多相关文章
- Javascript中,实现十大排序方法之一(冒泡排序及其优化设想)
冒泡排序的Javascript实现 首先定义一个取值范围在(0~100000)之间的随机值的长度为10万的数组, function bubbleSort(arr) { console.time('冒泡 ...
- JavaScript实现冒泡排序、快速排序、插入排序
JavaScript实现冒泡排序.快速排序.插入排序 时间:2014-01-09 18:05:51 来源: 作者:胡晗 冒泡排序的基本思想:所谓冒泡就是泡泡一个一个往上冒,让体积最轻的泡泡浮在最上 ...
- javascript中的sort()方法
现在在学习javascript中,发现sort()函数是有点奇怪的东西(可能是本人水平的问题-_-!),于是就在这里记录一下自己找到的东西吧.sort()这个方法的参数很奇怪,必须是函数,但也是可选参 ...
- javascript的冒泡排序, 快速排序, 选择排序, 插入排序
冒泡排序, 最经典的排序, 把比较大的数字往后放, 和选择排序恰恰相反: <!DOCTYPE html> <html lang="en"> <head ...
- JavaScript中简单排序总结
JavaScript中简单排序总结 冒泡排序 经典排序算法, 双重for循环 在第二个for循环的时候, j < arr.len -1 -i , 这一步的优化很重要 function bullS ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- JavaScript 中的数据类型
Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
随机推荐
- spring mvc rest 方式
handler中编写方式: @RequestMapping("/{userName}/ajaxUser3.do") @ResponseBody public UserInfo aj ...
- spring mvc 参数传递的三种方式
springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- 我的小工具开源一下-PingTest
v博客前言 先交代下背景,最近我们项目组的网络真是太渣了,时常remote不了另外一个地方的机器,过个几分钟就断开连接,太烦躁了,严重影响工作心情...于是想着做个工具记录下每天的断开remote连接 ...
- 关于redis的主从、哨兵、集群
关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...
- iOS之内存分析
静态内存分析(Product->Analyze) 静态内存分析是不运行程序,直接对代码进行分析. 但是没有真正分配内存,根据代码的上下文的语法结构,来分析是否有内存泄露 缺点:不一定准确,但是如 ...
- Dynamics CRM 2015-Auto Save
Auto Save,顾名思义,就是不需要明确地点击Save按钮,自动保存.这个功能在创建CRM Organization的时候,默认是开启的. 需要注意的是: 1. Auto Save适用于Main ...
- Leaflet+heatmap实现离线地图加载和热力图应用
本人博客主页:http://www.cnblogs.com/webbest/ 2017年春节已经过完,新一年的奋斗也刚刚开始.今年要经历的挑战也是大大的...不扯了. 年底前软件项目相对较多,恰巧在年 ...
- 面试之Java知识整理
1.面向对象都有哪些特性 继承.封装.多态性.抽象 2.Java中实现多态的机制是什么? 继承与接口 3.Java中异常分为哪些种类 3.1按照异常需要处理的时机分为编译时异常(CheckedExce ...
- JS 与 OC
做项目需要从网页点击跳转到app的一个页面上,并且需要获取参数. 当时后台给写的参数是这样的.自己打开浏览器看的源码 JavaScript:window.location.href= 这句话在js ...
- 理解javascript this 的绑定过程
在理解this 的绑定过程之前,首先要理解调用位置:调用位置就是函数在代码中被调用的位置(而不是声明的位置).只有仔细分析调用位置才能回答这个问题:这个this 到底引用的是什么?通常来说,寻找调用位 ...