js三種基礎數組排序算法整理
阿新 • • 發佈:2017-09-16
arr strong 一個 for 前端 分治 .proto 來看 sort
數組排序,大概是每個程序員必須掌握的基本算法 ,作為一個剛入門的前端小卒,再被各種面試各種排序折磨過後 ,看過很多別人寫的 算法 ,但看總歸是理解的不是那麽深刻 ,便想著自己整理一下這最基本的三個排序算法 ,希望對還在學習的你有些許幫助 。比較基本的三種算法 。冒泡、插入 、快速 。
首先來看冒泡排序法 ,基本原理其實就是對數組進行兩層循環,外層循環控制次數,數組中有多少個成員,便是要進行多少次內層遍歷,不斷地將當前成員和下一成員進行對比 ,其實在群眾偶其中有很多次是重復對比的 ,先看這樣一個寫法 :
Array.prototype.bubbleSort=function (){
for(var i=0;i<this.length;i++){
for(var j=0;j<this.length-1;j++){
if(this[j]>this[j+1]){
var temp=this[j]; this[j]=this[j+1]; this[j+1]=temp; } } } return this; }
這個無疑是最最基本 的寫法了 ,但實際上這個還可以稍做一下優化 ,節省其時間復雜度 ,看代碼如下 :
Array.prototype.bubbleSort=function (){
for(var i=0;i<this.length;i++){
for(var j=0;j<this.length-i-1;j++){
if(this[j]>this[j+1]){
var temp=this[j];
this[j]=this[j+1];
this[j+1]=temp;
}
}
}
return this;
}
再者 來看插入排序 ,顧名思義 ,是將數組每一個成員 ,一一插入到正確的位置,假設第一個成員【0】已經完成排序 ,然後從【1】開始遍歷數組 ,每外層遍歷一次 內層循環便跟之前已排序好的每個成員進行比較 ,若arr【j-1】>arr【j】,則交換位置,以此類推,直到退出循環,將其插入到正確的位置;代碼如下 :
Array.prototype.insertSort=function (){ var prevIndex,current; for(var i=1;i<this.length;i++) { prevIndex=i-1; current=this[i]; while(prevIndex>=0&&this[prevIndex]>current){ this[prevIndex+1]=this[prevIndex]; prevIndex--; } this[prevIndex+1]=current; } return this; } var arr=[12,3,23,45,32]; arr.insertSort();
最後我們來看一下比較有實用價值的快速排序法 ;快速排序法原理是將數組不斷地進行分治,聲明兩個數組 left和right,然後選擇數組中間一個成員作為 基準base ,將比其大的push進right數組 ,比其小的push進左邊數組 ,接著遞歸接著對left和right數組進行繼續分組排序 ,每分一次組便對left、base、right進行concat,以此類推 ,直到排序完成,代碼如下:
Array.prototype.quickSort=function(){ if(this.length<=1){return this}; var baseIndex=Math.floor(this.length/2); var base=this.splice(baseIndex,1)[0]; var left=[],right=[]; for(var i=0;i<this.length;i++){ if(this[i]<base){ left.push(this[i]); }else{ right.push(this[i]); } } return left.quickSort().concat([base],right.quickSort()); } var a=[12,2,34,32,16]; a.quickSort();
js三種基礎數組排序算法整理