冒泡排序:就是将一个数组中的元素按照从大到小或者从小到大的顺序进行排列。
var array=[9,8,7,6,5,4,3,2,1];
第一轮比较:8,7,6,5,4,3,2,1,9 交换了8次 i=0 j=array.length-1-i
第二轮比较:7,6,5,4,3,2,1,8,9 交换了7次 i=1 j=array.length-1-i
第三轮比较:6,5,4,3,2,1,7,8,9 交换了6次 i=2 j=array.length-1-i
第四轮比较:5,4,3,2,1,6,7,8,9 交换了5次 i=3 j=array.length-1-i
第五轮比较:4,3,2,1,5,6,7,8,9 交换了4次 i=4 j=array.length-1-i
第六轮比较:3,2,1,4,5,6,7,8,9 交换了3次 i=5 j=array.length-1-i
第七轮比较:2,1,3,4,5,6,7,8,9 交换了2次 i=6 j=array.length-1-i
第八轮比较:1,2,3,4,5,6,7,8,9 交换了1次 i=7 j=array.length-1-i
代码实现:
var temp; var array=[9,8,7,6,5,4,3,2,1]; //外循环控制轮数 for(var i=0;i<array.length-1;i++){ //内循环控制比较次数 for(var j=0;j<array.length-1-i;j++){ if(array[j]>array[j+1]){ //交换两个变量 temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } console.log(array);
代码优化:
var temp,bool,m=0; var array=[9,8,7,6,5,4,3,2,1]; for(var i=0;i<array.length-1;i++){ //开闭原则中的开关 bool = true; for(var j=0;j<array.length-1-i;j++){ if(array[j]>array[j+1]){ //交换两个变量 temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; bool=false;//将开关关闭 } } //如果内循环中的if没有被执行(开关关闭,执行下面的语句); if(bool){ break; } m++; } console.log(array+",比较"+m+"轮");
备注:比较轮数最好情况为0轮,最坏为8轮
我们再来看个冒泡排序的算法
//javascript冒泡排序,直接添加到基础类型的原型上 //这里用一个javascript语言精粹上的 代码,为基础类型原型添加方法, // 因为Array,String他们自身也是构造函数,他们创建对象也是通过new 构造函数行的,因此Array.prototype,String.prototype都指向了Function.prototype // Array.method的时候,先访问Array自身函数对象没有method方法,接着Array.prototype仍没有,接着Function.prototype找到了 Function.prototype.method = function (name, func) { if(!this.prototype[name]){ //最好先判断一下是原型中否有这个方法,如果没有再添加 this.prototype[name] = func; } return this; }; Array.method('bubble',function(){ // 冒泡算法 总共循环数组的长度次,即len次,每次将最小的放最后 var len = this.length; var i = 0, j = 0, tmp =0; for (i=0 ; i < len; i++) { for ( j = 0; (j +1) < len-i; j++) { console.log() if ( this[j] > this[j+1] ){ tmp = this[j]; this[j] = this[j+1]; this[j+1] = tmp; } }; }; return this; }); alert([21,32,1,31,22,45,68,37,].bubble());
看了另一个前端工程师,西风瘦马的代码,在第一层for循环加入初始化一个exchange交换标志为false,当有交换发生时,则变为true,在第二层for循环结束后加入一个判断,如果为false,即从前往后对比没有交换,证明已经大小顺序正确,即可break来跳出外层for循环。
//需要排序的数组 var list = Array(23, 45, 18, 37, 92, 13, 24); //数组长度 var n = list.length; //交换顺序的临时变量 var tmp;// //交换标志 var exchange; //最多做n-1趟排序 for (var time = 0; time <n - 1; time ++) { exchange = false; for (var i = n - 1; i> time; i–-) { if (list[i] <list[i - 1]) { exchange = true; tmp = list[i - 1]; list[i - 1] = list[i]; list[i] = tmp; } } //若本趟排序未发生交换,提前终止算法 if (!exchange) { break; } } alert(‘数组排序后为:' + list + ‘,n共排了' + time + ‘趟');
之前还收藏过一个网友的算法,也相当不错,大家看下
function BubbleSort(array) { var length = array.length; var temp; var isSort=false; for(var i = 1; i < length; i++) { isSort = false; for(var j = 0; j < length - i; j++) { if(array[j] > array[j+1]) { //交换 temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; isSort = true; } } if(!isSort) break; //如果没有发生交换,则退出循环 } } var array =[10,-3,5,34,-34,5,0,9]; BubbleSort(array); for(var i=0;i< array.length;i++) { document.write(array[i]+ " "); }
好了,今天就先给大家总结这些吧,希望对小伙伴们学习JavaScript冒泡排序能够有所帮助
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。