对选择法和冒泡法的一些见解
2014-03-28 16:08
155 查看
之前对选择法和冒泡法的概念有点犯晕,秉着死记的心思去学它。今天看对象的时候,不小心看到排序,就静下心来回忆选择法和冒泡法的代码,记忆细胞实在不给力,基本上忘光了。哎,本人对此有强迫症,就开始分析实现方式,所以就有了下面的代码。
先做一个说明,选择法和冒泡法的主要作用是将数组升序或者降序,我这里着重讲解降序,写下以下数组。
[b]一、选择法(降序)[/b]
先附上代码:
实现方式:是将比较数与被比较数(后面所有数)进行比较,如果array[0]>array[1|2|3...],则两者交换位置,反之位置不变,看下图。
![](http://images.cnitblog.com/i/572602/201403/281515503129789.jpg)
总结:循环总次数是数组array的长度,array[i]表示比较数,第一次循环从第一个数开始比较,第二次循环从第二个数开始比较,依次类推……array[j]表示被比较数,循环完一次(i增加1),被比较数就少一次,被比较数总是比较数后面的数(因为不需要和自己比较)。
总归老说,选择法比较方式就是:
第一个数和后面所有数比较;(第一次循环)
第二个数和后面所有数比较;(第二次循环)
第三个数和后面所有数比较;(第三次循环)
……
第n个数和后面所有数比较;(第n次循环)
[b]二、冒泡法(降序)[/b]
先附上代码:
实现方式:冒泡法和选择法不一样的地方在,和选择法不一样的是它没有比较数和被比较数之分,因为里面的数既是比较数又是被比较数。冒泡法在循环中,第一个数和第二个数比较,第二个数和第三个比较,第三个数和第四个数比较……依次类推。如下图:
![](http://images.cnitblog.com/i/572602/201403/281551581561333.jpg)
总结:循环总次数是数组array的长度,第一次循环中,比较5次;第二次循环中,比较4次;第三次循环中比较3次……。比较次数逐渐减少,冒泡冒泡,表示大的数都已经冒出来了,不需要比较了。循环一次,出来一个大的,再循环,再出来一个大的……依次类推,比较次数为array.length-n。
总归老说,冒泡法比较方式就是:
第一个数和第二个数,第二个数和第三个……;(第一次循环,比较次数为array.length)
第一个数和第二个数,第二个数和第三个……;(第二次循环,比较次数为array.length-1)
第一个数和第二个数,第二个数和第三个……;(第三次循环,比较次数为array.length-2)
……
第一个数和第二个数,第二个数和第三个……;(第n次循环,比较次数为array.length-n)
三、将冒泡法封装成组件(封装方式一样,就封装一个)
在html中调用此方法:
[b]三、数组去重[/b]
最后,非常感谢大家能够看完。有哪里讲解的不好或者是不正确的地方,希望大家能第一时间反馈给我,希望和大家共同进步,谢谢~
先做一个说明,选择法和冒泡法的主要作用是将数组升序或者降序,我这里着重讲解降序,写下以下数组。
var array = [10,4,1,9,2];
[b]一、选择法(降序)[/b]
先附上代码:
for(var i=0;i<array.length;i++){ /* i表示比较数下标,array[i]表示比较数 */ for(var j=i+1;j<array.length;j++){ /* j表示被表比较数下标,array[i]为被比较数 */ if(array[i]>array[j]){ var t = array[i]; array[i] = array[j]; array[j] = t; } } }
实现方式:是将比较数与被比较数(后面所有数)进行比较,如果array[0]>array[1|2|3...],则两者交换位置,反之位置不变,看下图。
![](http://images.cnitblog.com/i/572602/201403/281515503129789.jpg)
总结:循环总次数是数组array的长度,array[i]表示比较数,第一次循环从第一个数开始比较,第二次循环从第二个数开始比较,依次类推……array[j]表示被比较数,循环完一次(i增加1),被比较数就少一次,被比较数总是比较数后面的数(因为不需要和自己比较)。
总归老说,选择法比较方式就是:
第一个数和后面所有数比较;(第一次循环)
第二个数和后面所有数比较;(第二次循环)
第三个数和后面所有数比较;(第三次循环)
……
第n个数和后面所有数比较;(第n次循环)
[b]二、冒泡法(降序)[/b]
先附上代码:
for(var i=0;i<array.length;i++){ for(var j=0;j<array.length-i;j++){ if(array[j]>array[j+1]){ var t = array[j]; array[j] = array[j+1]; array[j+1] = t; } } }
实现方式:冒泡法和选择法不一样的地方在,和选择法不一样的是它没有比较数和被比较数之分,因为里面的数既是比较数又是被比较数。冒泡法在循环中,第一个数和第二个数比较,第二个数和第三个比较,第三个数和第四个数比较……依次类推。如下图:
![](http://images.cnitblog.com/i/572602/201403/281551581561333.jpg)
总结:循环总次数是数组array的长度,第一次循环中,比较5次;第二次循环中,比较4次;第三次循环中比较3次……。比较次数逐渐减少,冒泡冒泡,表示大的数都已经冒出来了,不需要比较了。循环一次,出来一个大的,再循环,再出来一个大的……依次类推,比较次数为array.length-n。
总归老说,冒泡法比较方式就是:
第一个数和第二个数,第二个数和第三个……;(第一次循环,比较次数为array.length)
第一个数和第二个数,第二个数和第三个……;(第二次循环,比较次数为array.length-1)
第一个数和第二个数,第二个数和第三个……;(第三次循环,比较次数为array.length-2)
……
第一个数和第二个数,第二个数和第三个……;(第n次循环,比较次数为array.length-n)
三、将冒泡法封装成组件(封装方式一样,就封装一个)
Function.prototype.method = function(name,func){ /* 将method方法加入到原型中(类似全局方法) */ this.prototype[name] = func; return this; } /* 数组升序 */ Array.method("sortUp",function(){ var own = this; /* 冒泡法 */ for(var i=0;i<own.length;i++){ for(var j=0;j<own.length-i;j++){ if(own[j]>own[j+1]){ var t = own[j]; own[j] = own[j+1]; own[j+1] = t; } } } return own; }) /* 数组降序 */ Array.method("sortDown",function(){ var own = this; /* 冒泡法 */ for(var i=0;i<own.length;i++){ for(var j=0;j<own.length-i;j++){ if(own[j]<own[j+1]){ var t = own[j]; own[j] = own[j+1]; own[j+1] = t; } } } return own; })
在html中调用此方法:
var array = [10,4,1,9,2]; console.log(array.sortUp()); /* 升序,输出[1,2,4,9,10] */ console.log(array.sortDown()); /* 降序,输出[10,9,4,2,1] */
[b]三、数组去重[/b]
var array = [2,2,3,1,2,4,5,6,6,7,"1",1,9], hash = {},newArray = [],i = 0, perfix = ""; for(i = 0; i < array.length; i++){ if(typeof array[i] == "string"){ /* 判断数组内容是字符串还是number */ perfix = "_str"; }else{ perfix = ""; } if(!hash[array[i] + perfix]){ hash[array[i]] = true; newArray.push(array[i]); } }
最后,非常感谢大家能够看完。有哪里讲解的不好或者是不正确的地方,希望大家能第一时间反馈给我,希望和大家共同进步,谢谢~
相关文章推荐
- 【小白笔记】PHP学习之路 (18) --数组遍历、统计、计算
- 电子银行业务分析系统—项目总结
- Linux 下安装 wowza 服务器
- 成功安装Oracle 11g后的7个服务
- 二分匹配啊
- phpstudy环境建立站点
- Linux 下安装 wowza 服务器
- JVM调优总结(五)-分代垃圾回收详述1
- JS不同文件间函数调用
- java.lang.classnotfounderror:com/sun/tools/javac/main
- 零线和地线的区别,示波器如何测量市电?
- Eclipse下jQuery文件报错解决方案
- 在Excel中判断单元格是否包含日期
- 敏捷宣言:四种核心价值观和十二条原则
- [list] myfirstlist
- mysql处理字符串的两个绝招:substring_index,concat
- 特殊符号、符号
- Linux中的pkg-config使用
- 获取系统当前日期时间
- Linux学习之shell编程应用