一、排序
簡單實現(xiàn)數(shù)組排序
var arr = []; for(var i=0;i<20;i++){ arr.push(Math.floor(Math.random()*100)) } arr.sort(function(a,b){ return a>b?1:-1; }) alert(arr)
不能簡單使用sort方法,默認情況下 sort方法是按ascii字母順序排序的,而非我們認為是按數(shù)字大小排序,
sort() 方法可以接受一個 方法為參數(shù) ,這個方法有兩個參數(shù)。分別代表每次排序比較時的兩個數(shù)組項。sort()排序時每次比較兩個數(shù)組項都回執(zhí)行這個參數(shù),并把兩個比較的數(shù)組
項作為參數(shù)傳遞給這個函數(shù)。當函數(shù)返回值為1的時候就交換兩個數(shù)組項的順序,否則就不交換。
算法的數(shù)組排序
var arr = []; for(var i=0;i<20;i++){ arr.push(Math.floor(Math.random()*100)) } //生成一個無序的arr數(shù)組 function sort(arr,start,end){ //數(shù)組長度為1 if(start == end ){ return [arr[start]] }else if(start == end-1){ //數(shù)組長度為2,根據(jù)數(shù)值大小 來排序 if(arr[start]>arr[end]){ return [arr[end],arr[start]] }else{ return [arr[start],arr[end]] } } // 數(shù)組長度一半 var l = Math.floor((start+end)/2); //左邊數(shù)組 var arrLeft = sort(arr, start,l); //右邊數(shù)組 var arrRight = sort(arr,l+1,end); //返回結(jié)果 var result = []; //分割成兩部分 左右兩個數(shù)組 只比對數(shù)組中的第一個數(shù),那個數(shù)值小就把誰放到結(jié)果里面,并把小的數(shù)值刪除掉,固采用數(shù)組中的shift方法。一旦出現(xiàn)左邊數(shù)組或右邊數(shù)組,沒有數(shù)據(jù)的時候 //result數(shù)組就與還有數(shù)據(jù)的數(shù)組合并 采用 concat,并返回結(jié)果 while(arrLeft.length>0 || arrRight.length>0){ if(arrLeft.length==0){ result = result.concat(arrRight); break; }else if(arrRight.length==0){ result = result.concat(arrLeft); break; } if(arrLeft[0]<arrRight[0]){ result.push(arrLeft.shift()) }else{ result.push(arrRight.shift()); } } return result; } var arrSort = sort(arr,0,arr.length-1);//參數(shù) 數(shù)組,開始位置,結(jié)束位置 document.write(arr+'<br/>'+arrSort);
講解:數(shù)組排序主要是采用將數(shù)組一拆為二,直到不能為之,最后只能是拆掉數(shù)組里面只能是一個或者是兩個,因為數(shù)組的長度有奇數(shù)偶數(shù)之分,拆到最后 數(shù)組里面只有一個或者兩個之后 開始排序并返回結(jié)果,并將這些結(jié)果在一一比對 進行合并。這個方法 可能大家覺得 為什么要這么復(fù)雜,一直采用第一種不行嗎,其實當然可以啦,但是這個世界上還有性能這個詞匯,當數(shù)據(jù)之后幾個 幾十個 幾個百 ,大家的算出的結(jié)果時間是沒有什么區(qū)別的 ,如果當數(shù)據(jù)龐大的幾億 幾十億 我們還有這種自信用第一種方法嗎,其實js的算法就是分而治之,將很多問題劃分成小的來解決。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com