JavaScript實(shí)現(xiàn)經(jīng)典排序算法之冒泡排序
冒泡排序可謂是最經(jīng)典的排序算法了,它是基于比較的排序算法,時(shí)間復(fù)雜度為O(n^2),其優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,n較小時(shí)性能較好。
1)算法原理
相鄰的數(shù)據(jù)進(jìn)行兩兩比較,小數(shù)放在前面,大數(shù)放在后面,這樣一趟下來(lái),最小的數(shù)就被排在了第一位,第二趟也是如此,如此類推,直到所有的數(shù)據(jù)排序完成。
2)算法描述
<1>比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換它們兩個(gè);
<2>對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì),這樣在最后的元素應(yīng)該會(huì)是最大的數(shù);
<3>針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè);
<4>重復(fù)步驟1~3,直到排序完成。
3)javascript代碼實(shí)現(xiàn)
function bubbleSort(arr){ var len = arr.length; for (var i = 0; i < len; i++) { for(var j = 0; j < len - i -1; j++){ if(arr[j]>arr[j+1]){ //相鄰元素進(jìn)行對(duì)比 var temp = arr[j+1];//交換元素 arr[j+1] = arr[j]; arr[j] = temp; } } } return arr;//返回?cái)?shù)組 } var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];//調(diào)用排序算法 console.log(bubbleSort(arr));//控制臺(tái)輸出結(jié)果
這個(gè)算法是最基本的實(shí)現(xiàn)方法,接著進(jìn)行改進(jìn)這個(gè)算法,通過(guò)設(shè)置一個(gè)標(biāo)志性的變量position,用于記錄每趟排序中最后一次進(jìn)行交換的位置。因?yàn)閜osition位置之后的記錄都已經(jīng)排序好了,所以進(jìn)行下一趟排序時(shí)只需要掃描到position的位置就好。
改進(jìn)之后的算法如下:
function bubbleSort2(arr){ var i = arr.length -1;//開始時(shí),掃描的最后位置 while(i>0){ var position = 0;//標(biāo)志性變量,表示當(dāng)前排序中交換的位置 for(var j = 0; j < i; j ++){ if(arr[j]>arr[j+1]){ position = j; var temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } i = position; } return arr; } var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52]; console.log(bubbleSort2(arr));
傳統(tǒng)冒泡排序中每一趟排序操作只能找到一個(gè)最大值或最小值,我們考慮利用在每趟排序中進(jìn)行正向和反向兩遍冒泡的方法一次可以得到兩個(gè)最終值(最大者和最小者) , 從而使排序趟數(shù)幾乎減少了一半。
改進(jìn)之后的算法如下:
function bubbleSort3(arr){ var low = 0; var high = arr.length-1; var temp; while(low < high){//找到最大值 for(var j = low ; j < high ; j++){ if (arr[j]> arr[j+1]) { temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } --high;//修改high值,向前移一位 } while(low > high){//找到最小值 for(var j = high ;j > low; j--){ if (arr[j]> arr[j+1]) { temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } ++low;//修改low值,往后移動(dòng)一位 } return arr; } var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52]; console.log(bubbleSort3(arr));
4)算法分析
最佳情況:T(n) = O(n)
最差情況:T(n) = O(n2)
平均情況:T(n) = O(n2)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
動(dòng)態(tài)更新highcharts數(shù)據(jù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇?jiǎng)討B(tài)更新highcharts數(shù)據(jù)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05根據(jù)IP的地址,區(qū)分不同的地區(qū),查看不同的網(wǎng)站頁(yè)面的js代碼
在朋友的幫助下,找到一個(gè)比較方便的方法,就是把以下代碼,加入我們自己需要跳轉(zhuǎn)的頁(yè)面里,這樣做還是不錯(cuò)的呢2013-02-02JS定時(shí)刷新頁(yè)面及跳轉(zhuǎn)頁(yè)面的方法
這篇文章介紹了JS定時(shí)刷新頁(yè)面及跳轉(zhuǎn)頁(yè)面的方法,有需要的朋友可以參考一下2013-07-07JS中promise特點(diǎn)與信任問(wèn)題解決
大家都知道Promise解決了回調(diào)地獄的問(wèn)題,“回調(diào)地獄”所說(shuō)的嵌套其實(shí)是指異步的嵌套,它帶來(lái)了兩個(gè)問(wèn)題:可讀性的問(wèn)題和信任問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于JS中promise特點(diǎn)與信任問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下2022-06-06vue基于ElementUI動(dòng)態(tài)設(shè)置表格高度的3種方法
ElementUI+vue動(dòng)態(tài)設(shè)置表格高度的幾種方法,拋磚引玉,還有其它方法動(dòng)態(tài)設(shè)置表格高度,大家可以開動(dòng)腦筋2025-02-02javascript 解析后的xml對(duì)象的讀取方法細(xì)解
2009-07-07淺析Js中的單引號(hào)與雙引號(hào)問(wèn)題
本文是對(duì)Js中單引號(hào)與雙引號(hào)的使用進(jìn)行了總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11