冒泡排序(js版)
基本思想:两两比较相邻记录的关键字,如果反序则交换,直至没有反序为止。
- 最初的冒泡排序(初级版):
//从小到大
function BubbleSort(arr){
var i,j,temp;
for(i=0;i<arr.length-1;i++){
for(j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
return arr;
}
var arr=[10,7,9,11,22,33,4,2,0,1000];
BubbleSort(arr);
17 console.log(arr); //[0, 2, 4, 7, 9, 10, 11, 22, 33, 1000]
由于这样的排序仅仅是交换顺序,不算是真正的冒泡排序,效率也比较低。
当i=0,
arr[0]和它后边的每一项进行比较大小,前者大于后者,则进行交换。始终保证arr[0]为最小值。
当i=1,(arr[0]已经为最小值,不需要进行比较,)
arr[1]和它后边的每一项进行比较大小,前者大于后者,则进行交换。始终保证arr[1]为最小值(除去arr[0]以外)。
.......直至i=arr.length-2时,保证前arr.length-1项均“比较”小(小于后边的所有项),此时不再需要进行比较。(当n个数,前n-1个为“比较”小的值后,最后一个还有什么比较的意义呢??)
- 正宗的冒泡排序(将小的数字如同气泡一样慢慢的浮上表面)
//从小到大
function BubbleSort(arr){
var i,j,temp;
for(i=0;i<arr.length-1;i++){
for(j=arr.length-1;j>i;j--){
if(arr[j]<arr[j-1]){ //j为从后往前循环
temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
var arr=[10,7,9,11,22,33,4,2,0,1000];
BubbleSort(arr); 17 console.log(arr);// [0, 2, 4, 7, 9, 10, 11, 22, 33, 1000]
当i=0时,
j的第1次循环:j=arr.length-1,j从数组的最后一项开始和前一项比较大小,当前者小于后者,交换位置。
j的第2次循环:j=arr.length-2,继续和前一项比较大小。
......直至j=1时结束。此时数组的第一项为最小值。
当i=2时,
j的第1次循环:j=arr.length-1,j从数组的最后一项开始和前一项比较大小,当前者小于后者,交换位置。
j的第2次循环:j=arr.length-2,继续和前一项比较大小。
......直至j=2时结束(即比较完第三项和第二项,第一项已经确定,不需要进行比较)。此时数组的第二项为最小值(除去第一项以外)。
继续循环i,i=arr.length-2时。比较j的第arr.length项和第i=arr.length-1项,即可得到最终结果。
- 优化后的冒泡排序
当待排序的序列为{2,1,3,4,5,6,7,8,9},那么仅仅需要交换第一个和第二个关键字即可。但是前面的算法还是会将循环都执行一遍,造成了多余的计算。
此时我们可以添加一个标记变量flag。
//从小到大
function BubbleSort(arr){
var i,j,temp;
var flag=true; //flag进行标记
for(i=0;i<arr.length-1&&flag;i++){ //若flag为false则退出循环
flag=false; //初始化为false
for(j=arr.length-1;j>i;j--){
if(arr[j]<arr[j-1]){ //j为从前往后循环
temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
flag=true; //如果有数据交换则为true
}
}
}
return arr;
}
var arr=[10,7,9,11,22,33,4,2,0,1000];
BubbleSort(arr);
console.log(arr); // [0, 2, 4, 7, 9, 10, 11, 22, 33, 1000]
标记变量声明时状态为true,进行循环后,标记变量初始化为false状态。当后边的项两两进行比较时,发生交换则将标记变量状态更正为true,如果自始至终标记变量的状态都没有更正为true,说明为有序,则在外层循环的终止判断语句中退出。
优化的关键在于:
在变量i的for循环中,增加了对flag是否为true的判断。通过这种改进,可以避免在有序的情况下进行无意义的循环判断。
- 时间复杂度
1.最好的情况,即数组有序,可以推断出就是n-1次的比较,时间复杂度为O(n)
2.当最坏的情况,即数组逆序,第一个数需要排n-1次,第二个数需要排n-2次,第3个数需要排n-3次……这样依次类推,最后一个数只需要排一次,加起来共需要排n(n-1)/2次,所以时间复杂度为O(O^2)
看完大话数据结构,根据自己的理解整理了下,还请大家留下宝贵意见。
冒泡排序(js版)的更多相关文章
- 常见排序算法(JS版)
常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...
- Twitter面试题蓄水池蓄水量算法(原创 JS版,以后可能会补上C#的)
之前在群里有人讨论Twitter的面试题,蓄水池蓄水量计算,于是自己写了个JS版的(PS:主要后台代码还要编译,想想还是JS快,于是就使用了JS了.不过算法主要还是思路嘛,而且JS应该都没问题吧^_^ ...
- 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法
前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字 ...
- 团购、定时抢购倒计时js版
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org ...
- JS版百度地图API
地图的构建非常简单,官方的API文档也写得很清晰,我只做一总结: 一起jquery,17jquery 一.引入JS :这个很容易理解,既然是调用JS版的百度地图,肯定得引用外部的JS文件了,而这个文件 ...
- PureMVC(JS版)源码解析:总结
PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写博客的过程中得到了些提升.我也是第一次写系列 ...
- 全国三级城市联动 js版
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PureMVC(JS版)源码解析
PureMVC(JS版)源码解析:总结 PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写 ...
- js版贪吃蛇
之前没有写博客的习惯,这是我的第一个博客,有些的不好的地方,希望大家多多提意见 js版的贪吃蛇相对比较简单,废话不多说直接上代码,有需要注意的地方我会标红,github源码地址https://gith ...
- 跨浏览器的placeholder – 原生JS版
转自来源 : http://www.ifrans.cn/placehoder/ 跨浏览器的placeholder – 原生JS版 html5为input元素新增了一个属性”placeholder”,提 ...
随机推荐
- 学习shell脚本之前的基础知识(一)(学习记录帖)
记录命令历史:我们敲过的命令,linux会有记录,保存在家目录的.bash_history文件中.(备注:只有用户正常退出当前shell时,当前命令才会保存在.bash_history文件中) “ ...
- git 先建立本地分支,再传给线上库
cd 进入本地一个文件夹 git clone 文件下来 进入右下角 develop分支(remote braches) 新建分支 (check out) a 把新分支 a 传上线上 新建一个对立 ...
- SQL数据库优化
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Applese的毒气炸弹-最小生成树Kruskal算法
链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 题目描述 众所周知,Applese 是个很强的选手,它的化学一定很好. 今天他又AK了一套题觉得很 ...
- mysql ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 一般可通 ...
- Java的map键值对的用法,map的遍历,Entry对象的使用
思路: 1.定义集合 2.存储数据 3.添加元素 4.遍历 4.1将需要遍历的集合的键封装到set集合中(这用到了entrySet方法,和Entry对象) 4.2声明迭代器或者用for增强循环 4.3 ...
- java分解质因数,具体程序分析和代码
题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 将一个正整数分解质因数分析:对n进行分解质因数,找到最小的质数k如果这个质数恰好等于n则说明分解质因数过程已经结束,打印输出 ...
- git查看某个文件修改历史
[git查看某个文件修改历史] 1.使用git命令 git whatchanged charge.lua 显示某个文件的每个版本提交信息:提交日期,提交人员,版本号,提交备注(没有修改细节) git ...
- SimpleAdapter & BaseAdapter
[SimpleAdapter & BaseAdapter] 参考:http://blog.csdn.net/shakespeare001/article/details/7926783
- Mybatis批量更新和插入
<update id="updateOrInsert"> <foreach collection="list" index="ind ...