分享javascript實(shí)現(xiàn)的冒泡排序代碼并優(yōu)化
冒泡排序:就是將一個(gè)數(shù)組中的元素按照從大到小或者從小到大的順序進(jìn)行排列。
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
代碼實(shí)現(xiàn):
var temp; var array=[9,8,7,6,5,4,3,2,1]; //外循環(huán)控制輪數(shù) for(var i=0;i<array.length-1;i++){ //內(nèi)循環(huán)控制比較次數(shù) for(var j=0;j<array.length-1-i;j++){ if(array[j]>array[j+1]){ //交換兩個(gè)變量 temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } console.log(array);
代碼優(yōu)化:
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++){ //開閉原則中的開關(guān) bool = true; for(var j=0;j<array.length-1-i;j++){ if(array[j]>array[j+1]){ //交換兩個(gè)變量 temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; bool=false;//將開關(guān)關(guān)閉 } } //如果內(nèi)循環(huán)中的if沒有被執(zhí)行(開關(guān)關(guān)閉,執(zhí)行下面的語句); if(bool){ break; } m++; } console.log(array+",比較"+m+"輪");
備注:比較輪數(shù)最好情況為0輪,最壞為8輪
我們?cè)賮砜磦€(gè)冒泡排序的算法
//javascript冒泡排序,直接添加到基礎(chǔ)類型的原型上 //這里用一個(gè)javascript語言精粹上的 代碼,為基礎(chǔ)類型原型添加方法, // 因?yàn)锳rray,String他們自身也是構(gòu)造函數(shù),他們創(chuàng)建對(duì)象也是通過new 構(gòu)造函數(shù)行的,因此Array.prototype,String.prototype都指向了Function.prototype // Array.method的時(shí)候,先訪問Array自身函數(shù)對(duì)象沒有method方法,接著Array.prototype仍沒有,接著Function.prototype找到了 Function.prototype.method = function (name, func) { if(!this.prototype[name]){ //最好先判斷一下是原型中否有這個(gè)方法,如果沒有再添加 this.prototype[name] = func; } return this; }; Array.method('bubble',function(){ // 冒泡算法 總共循環(huán)數(shù)組的長度次,即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());
看了另一個(gè)前端工程師,西風(fēng)瘦馬的代碼,在第一層for循環(huán)加入初始化一個(gè)exchange交換標(biāo)志為false,當(dāng)有交換發(fā)生時(shí),則變?yōu)閠rue,在第二層for循環(huán)結(jié)束后加入一個(gè)判斷,如果為false,即從前往后對(duì)比沒有交換,證明已經(jīng)大小順序正確,即可break來跳出外層for循環(huán)。
//需要排序的數(shù)組 var list = Array(23, 45, 18, 37, 92, 13, 24); //數(shù)組長度 var n = list.length; //交換順序的臨時(shí)變量 var tmp;// //交換標(biāo)志 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; } } //若本趟排序未發(fā)生交換,提前終止算法 if (!exchange) { break; } } alert(‘?dāng)?shù)組排序后為:' + list + ‘,n共排了' + time + ‘趟');
之前還收藏過一個(gè)網(wǎng)友的算法,也相當(dāng)不錯(cuò),大家看下
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; //如果沒有發(fā)生交換,則退出循環(huán) } } var array =[10,-3,5,34,-34,5,0,9]; BubbleSort(array); for(var i=0;i< array.length;i++) { document.write(array[i]+ " "); }
好了,今天就先給大家總結(jié)這些吧,希望對(duì)小伙伴們學(xué)習(xí)JavaScript冒泡排序能夠有所幫助
- javascript中數(shù)組的冒泡排序使用示例
- js實(shí)現(xiàn)數(shù)組冒泡排序、快速排序原理
- js交換排序 冒泡排序算法(Javascript版)
- js 排序動(dòng)畫模擬 冒泡排序
- JavaScript 冒泡排序和選擇排序的實(shí)現(xiàn)代碼
- JS實(shí)現(xiàn)冒泡排序,插入排序和快速排序并排序輸出
- js基本算法:冒泡排序,二分查找的簡單實(shí)例
- js sort 二維數(shù)組排序的用法小結(jié)
- JavaScript自定義數(shù)組排序方法
- javascript數(shù)組排序匯總
- JavaScript數(shù)組基于交換的排序示例【冒泡排序】
相關(guān)文章
簡述JavaScript對(duì)傳統(tǒng)文檔對(duì)象模型的支持
這篇文章主要介紹了簡述JavaScript對(duì)傳統(tǒng)文檔對(duì)象模型的支持,是JS學(xué)習(xí)進(jìn)階中的重要知識(shí),需要的朋友可以參考下2015-06-06JavaScript對(duì)象學(xué)習(xí)經(jīng)驗(yàn)整理
主要包括對(duì)象的創(chuàng)建、對(duì)象屬性的設(shè)置和查詢、對(duì)象方法等等,整理如下,感興趣的朋友可以參考下2013-10-10Javascript學(xué)習(xí)筆記6 prototype的提出
所以你還會(huì)再說是否用prototype都是一樣的么?其實(shí)我以前也是這么理解的,在這次偶然的試驗(yàn)中看到了這個(gè)問題。2010-01-01基于JavaScript實(shí)現(xiàn) 獲取鼠標(biāo)點(diǎn)擊位置坐標(biāo)的方法
本篇文章,小編將為大家介紹基于JavaScript實(shí)現(xiàn) 獲取鼠標(biāo)點(diǎn)擊位置坐標(biāo)的方法。有需要的朋友可以參考一下2013-04-04簡介JavaScript中的getSeconds()方法的使用
這篇文章主要介紹了簡介JavaScript中的getSeconds()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06JavaScript 瀏覽器對(duì)象模型BOM使用介紹
這篇文章主要介紹了JavaScript 瀏覽器對(duì)象模型BOM使用介紹,需要的朋友可以參考下2015-04-04輕松學(xué)習(xí)JavaScript函數(shù)中的 Rest 參數(shù)
ES6 引入 rest 參數(shù)用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對(duì)象了。rest 參數(shù)搭配的變量是一個(gè)數(shù)組,該變量將多余的參數(shù)放入數(shù)組中。下面我們來詳細(xì)了解一下吧2019-05-05JavaScript實(shí)現(xiàn)表單驗(yàn)證
這篇文章介紹了JavaScript實(shí)現(xiàn)表單驗(yàn)證的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-050基礎(chǔ)學(xué)習(xí)前端開發(fā)的一些建議
這篇文章主要介紹了0基礎(chǔ)學(xué)習(xí)前端開發(fā)的一些建議,文中一些建議非常寶貴,希望能幫助想學(xué)前端的你,感興趣的朋友可以了解下2020-07-07