フロントエンドの一般的なアルゴリズム

14063 ワード

多くの初心者はアルゴリズムがバックグラウンドのことだと思っているかもしれませんが、先端を学ぶにはアルゴリズムを学ぶ必要はありません.これは誤解です!!今日は先端で理解すべきアルゴリズムの知識を整理しました.
ツールバーの
一、バブルソート原理:隣接する2つのデータの大きさを比較するたびに、小さいものが前に並び、前のデータが後ろのデータより大きい場合は、この2つの数の位置を交換する.
function bubbleSolt( arr ){

    var len = arr.length;
    //              ,                 。
    for( var i=0; ifor( var j=0; j1-i; j++ ){
            if( arr[j]>arr[j+1] ){  //         
                var temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

二、高速ソート原理:まず1つの基準点(一般指数グループの中部)を見つけて、それから配列はこの基準点によって2つの部分に分けられて、順次この基準点データと比較して、それより小さいならば、左に置きます;逆に、右に置きます.比較後のデータを左右にそれぞれ1つの空の配列で格納する.最後に、配列長<=1になるまで、上記の動作を再帰的に実行する.
function quickSort( arr ){

    if( arr.length<=1 ){
        return arr;
    }

    var mid = Math.floor( arr.length/2 );
    var midItem = arr.splice( mid, 1 )[0];
    var left = [];
    var right = [];

    for( var i=0; i<arr.length; i++ ){
        if( arr[i]else{
            right.push( arr[i] );
        }
    }
    return quickSort( left ).concat( midItem, quickSort( right ) );
}

三、挿入ソート原理:まず最初の2つのデータを小さいから大きいまで比較する.次に、3番目のデータを最初の2つのデータと比較し、3番目のデータを適切な位置に挿入します.このように推す.
function insertSort(arr){
    var temp, j;
    for(var i=1; i<arr.length; i++){
           temp =arr[i];
           j=i;
           while(j>0 && arr[j-1]>temp){
                arr[j]=arr[j-1];
                j--;
           }
           arr[j]=temp;
    }
    return arr;
}

四、集計ソート原理:1つの配列を2つの配列に分け、左に並べ、右に並べ、一緒にソートする.
function mergeSort( arr ){
    //        
    if( arr.length<2 ){
        return arr;
    }
    //     
    var mid = Math.floor( arr.length/2 );
    var left = arr.slice( 0,mid );
    var right = arr.slice( mid );

    if( left == "undefined" && right == "undefined" ){
        return false;
    }

    return merge(mergeSort(left), mergeSort(right));

}

function merge( left, right ){
    var result = [];

    while( left.length && right.length ){

        if( left[0] <= right[0] ){
            // left        ,  push result   
            result.push( left.shift() );
        }else{
            // right        ,  push result   
            result.push( right.shift() );
        }
    }
    //        ,              ,     
    while( left.length ){
        result.push( left.shift() );
    };
    while( right.length ){
        result.push( right.shift() );
    }
    return result;
}

文字列アクション
一、判断回文文字列回文文字列は、abaのような左から右へ読む文字列である.
function palindrome(str){
    // \W         。   “[^A-Za-z0-9_]”。
    var re = /[\W_]/g;
    //           ,            
    var lowRegStr = str.toLowerCase().replace(re,'');
    //      lowRegStr length   0 ,     palindrome
    if(lowRegStr.length===0) return true;
    //                    ,        palindrome
    if(lowRegStr[0]!=lowRegStr[lowRegStr.length-1]) return false;
    //  
    return palindrome(lowRegStr.slice(1,lowRegStr.length-1));
}

二、文字列を反転する考え方一:文字列を逆方向に遍歴する
function resverseString( str ){

    var temp = "";
    for( var i = arr.lenght-1; i>=0; i-- ){
        temp += str[i];
        return temp;
    }
}

考え方2:array操作に変換
function( str ){

    var arr = str.split("");
    var i = 0, j=arr.length-1;
    while( ireturn arr.join("");
}

指定された長さのランダム文字列を生成します(検証コードを生成できます).
function randomString( n ){

    var str = "abcdefghijklmnopqrstuvwxyz";
    var temp = "";
    for( var i=0; iMath.round( Math.random()*str.length ));
    }
    return temp;
}

統計文字列の最大文字数
function findMaxCode( str ){

        var json = {};

        for( var i =0; iif( !json[ str.charAt(i) ] ){
                json[ str.charAt(i) ] = 1;
            }else{
                json[ str.charAt(i) ] += 1; 
            }
        }

        var code = "",num = 0;

        for( var key in json ){
            if( json[key] > maxValue ){
                num = json[key];
                code = key;
            }
        }

        alert('        :'+code+'  '+num+' ');
    }

はいれつそうさ
はいれつデポジット
function unique( arr ){

    var obj = {};
    var result = [];

    for( var i in arr ){
        if( !obj[ arr[i] ] ){
            obj[ arr[i] ] = true;
            result.push( arr[i] );
        }
    }
    return result;
}

配列内の最大差
function getMaxProfit( arr ){

var min = arr[0];
var max = arr[0];

for( var i =0; i< arr.length, i++ ){
    if( arr[i]<min ){
        min = arr[i];
    }
    if( arr[i]>max ){
        max = arr[i];
    }
}

return max-min;
}

その他
階乗非再帰実装
function factorialize(num) {
var result = 1;
         if(num < 0) return -1;
         if(num == 0 || num == 1) return 1;
         while(num>1) {
         result *= num--;
    }
    return result;
}

再帰的な実装
function factorialize(num) {
    var result = 1;
    if(num < 0) return -1;
    if(num == 0 || num == 1) return 1;
    if(num > 1) return num*factorialize(num-1);
}