第九天 《簡易算法代碼》

算法:就是解決問題的方法和步驟,算法和相關的計算機語言無關

  1. 使用find:線型查找

    遞歸代碼:
    <script type="text/javascript">
    function jiecheng(n){
    if( n == 1){
    return 1;
    }
    return n * jiecheng(n-1);
    }
    alert(jiecheng(4));
    </script>

數組:

      1:后面加一個數:arr.push()
      2:后面刪除一個數:arr.pop()
      3:前面加一個數:arr.unshift() 
      4:前面刪除一個數:arr.shift(); //刪除后返回的值是:number    
      5:刪除:arr.splice('位置',刪除幾個);//刪除后返回值是:objert
  1. find2:二分查找

    find2:也叫分治法可以解決大多數算法問題。
    1:數組必須是有序的數組  
    2:必須知道怎么找中間數(取中間數的時候是偏左取)取中間值:Math.floor((s+e)/2); 
    3:要知道起始位置和結束范圍
    

二分查找代碼:

    //在數組里找重復
        function findInArray(n,arr){
            for(var i = 0; i <arr.length; i++){
                if(arr[i] == n){
                    return true;
                }
            }
            return false;
        }
        function removeDup(arr,s,e){
            if(s>e){
                return [];
            }
            else if(s==e){
                return[arr[s]];
            }
            var c = Math.floor((s+e)/2);
            var left = removeDup(arr,s,c);
            var right = removeDup(arr,c+1,e);
            
            for(var i = 0; i < right.length; i++ ){
                if(!findInArray(right[i],left)){
                    left.push(right[i]);
                }
            }
            return left;
        }
        var arr = [28,18,35,64,18,35,64,80];
        //document.write(removeDup(arr,0,arr.length-1));
        document.write(removeDup(arr,0,arr.length-1));

(1):找最小值:首先要一分為二,left值=遞歸后左邊最小,right值=遞歸后右邊最小 ,最后比較left和right的返回值

在數組里找最小值的代碼:

        function findMin(arr,s,e){
            if(s>e){
                return false;
            }
            else if(s==e){
                return arr[s];
            }
            
            var c = Math.floor((s+e)/2);
            var left = findMin(arr,s,c);
            var right = findMin(arr,c+1,e);
            
            if(left < right){
                return left;
            }
            else{
                return right;
            }
        };
        var arr = [28,-90,-100,50,60,100,700];
        alert(findMin(arr,0,arr.length-1));

(2):數組去重:首先要一分為二,left遞歸后去重復,right遞歸后去重,循環right。如果不在left里,就加到left,然后返回left。
去重復代碼:

  function findInArray(n,arr){
    for(var i=0; i<arr.length; i++){
        if(arr[i] == n){
            return true;
        }
    }
    return false;
};
    function removeDup(arr,s,e){
        if(s>e){
            return [];
        }
        else if(s == e){
            return [arr[s]];
        }           
        var c= Math.floor((s+e)/2);
        var left = removeDup(arr,s,c); 
        var right = removeDup(arr,c+1,e);           
        for(var i =0; i<right.length;i++){  
            if(!findInArray(right[i],left)){
                left.push(right[i]);
            }
        }
        return left;
    };
    var arr = [28,19,48,29,-40,48,100];
    document.write(removeDup(arr,0,arr.length-1));

2:選擇排序:(插入排序):從剩余的數據中,找嘴角的放到前面,并交換當前位置

選擇排序代碼:

         function selectionSort(arr){
            for(var i=0; i<arr.length; i++){
                for(var j=i+1; j<arr.length; j++){
                    if(arr[i]>arr[j]){
                        var tmp = arr[j];
                        arr[j] = arr[i];
                        arr[i] =tmp;
                    }
                }
            }
            return arr;
        };
        var arr = [-105,67,78,95,28,46];
        document.write(selectionSort(arr));

3:歸并排序:分治法或者二分法思路左面排序自己,右邊排序自己,每一比較左右數組的第一個值,比較后的最小值放到新的數組里。

歸并排序代碼:

      function mergesSort(arr,s,e){
    //判斷相等的時候
    if(s>e){
        return [];  
    }else if( s==e){
        return [arr[s]];
    }
    //從中間切開
    var c = Math.floor((s+e)/2);
    var left = mergesSort(arr,s,c);
    var right = mergesSort(arr,c+1,e);
    var result = [];
    while(left.length || right.length){
        if(left[0]>right[0]){
            result.push(right.shift());
        }else{
            result.push(left.shift());
        }
        if(left.length == 0){
        result = result.concat(right);
            break;
        }else if(right.length == 0){
        result = result.concat(left);
            break;
        }
    }
    return result;
}
    var arr = [-105,28,29,30,29,28,45,30];
    document.write(mergesSort(arr,0,arr.length-1));

4:快速排序:分治法思路,找到中間位置,準備兩個空數組分別方左右的值,遞歸后調用,鏈接數組c=arr.splice(cIndex,1),c[0]是中間的數組。

快速排序代碼:

       function quickSort(arr,s,e){
    //判斷是否相等
    if(arr.length == 0 ){
        return [];
    }
    var cIndex = Math.floor((s+e)/2);
    var c = arr.splice(cIndex,1);
    var left = [];
    var right = [];
    for(var i=0; i<arr.length; i++){
        if(arr[i]<c[0]){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }
    //遞歸返回
    return quickSort(left).concat(c,quickSort(right));
}
    var arr = [-105,29,30,45,16,57];
    document.write(quickSort(arr));

數據結構:算法離不開數據結構,算法沒有最好的算法,只有最合適的算法(有序數組--是數據結構 無序數組--是數據結構)

衡量算法的好壞兩個指標:

        1,時間(時間復雜度用O表示)
        2,空間(空間復雜度S表示)

1:二叉樹:
2:散列:也叫(哈希--hash)是指數組 存數據時使用下標
分析不同的數據結構是指:1,增加 2修改 3刪除 4查詢
數據不重復:(測試以毫秒為單位的運算速度)

                        增加:            查詢:           綜合
 無序數組:                50                39             85
 有序數組:             5000                5             5100           
   二叉樹:              25                 12             35
    散列:               10                10              20
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容