冒泡排序-javascript算法
冒泡排序-在javascript中的实现
这里把自己刚在javascript语言精粹上学的一点东西拿出来
加上了自己的理解,这本书的确很犀利,虽然不厚,但是每个点都讲的恰到好处,适合javascript有一定基础,对高级程序设计能看过一遍的人看。
不知道为啥好几本javascript好书都停产了,让我只能看电子书,不happy
1 //javascript冒泡排序,直接添加到基础类型的原型上 2 //这里用一个javascript语言精粹上的 代码,为基础类型原型添加方法, 3 // 因为Array,String他们自身也是构造函数,他们创建对象也是通过new 构造函数行的,因此Array.prototype,String.prototype都指向了Function.prototype 4 // Array.method的时候,先访问Array自身函数对象没有method方法,接着Array.prototype仍没有,接着Function.prototype找到了 5 Function.prototype.method = function (name, func) { 6 if(!this.prototype[name]){ 7 //最好先判断一下是原型中否有这个方法,如果没有再添加 8 this.prototype[name] = func; 9 } 10 return this; 11 }; 12 13 14 Array.method('bubble',function(){ 15 // 冒泡算法 总共循环数组的长度次,即len次,每次将最小的放最后 16 17 var len = this.length; 18 var i = 0, 19 j = 0, 20 tmp =0; 21 22 23 for (i=0 ; i < len; i++) { 24 for ( j = 0; (j +1) < len-i; j++) { 25 console.log() 26 if ( this[j] > this[j+1] ){ 27 tmp = this[j]; 28 this[j] = this[j+1]; 29 this[j+1] = tmp; 30 } 31 }; 32 }; 33 34 return this; 35 }); 36 37 alert([21,32,1,31,22,45,68,37,].bubble());
看了另一个前端工程师,西风瘦马的代码,在第一层for循环加入初始化一个exchange交换标志为false,当有交换发生时,则变为true,在第二层for循环结束后加入一个判断,如果为false,即从前往后对比没有交换,证明已经大小顺序正确,即可break来跳出外层for循环。
这里附上代码
// 西风瘦马的冒泡排序代码 // http://blog.tugai.net/2009/03/08/javascript-bubble-sort/ //需要排序的数组 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 + ‘趟’);