JavaScript基礎(四) ---- 算法

1. 快速排序

思路:
1. 先從這個數組中取出中間一項的位置;
2. 取到這個中間位置對應的值;
3. 拿數組中的每一項,跟中間值進行比較;如果比他小,放左邊的數組; 如果比他大,就放右邊的數組;
4. 什麼時候停止切分: 數組的長度<=1;
代碼:
var ary=[21,8,5,34,9];
function quickSort(ary){
        //1.判斷是否符合切割條件,如果不符合,直接返回;
        if(ary.length<=1){
            return ary;
        }
        //2.符合切割條件
        //1)取中間位置;
        var num=Math.floor(ary.length/2);
        //2)取中間值並且要對原數組造成影響
        var numValue=ary.splice(num,1)[0];//這裏是一個數字
        //3)拿數組中的每一項跟中間值numValue進行比較,比他小,放left數組,反之,放right數組;
        var left=[];
        var right=[];
        for(var i=0; i<ary.length; i++){
            var cur=ary[i];
            if(cur<numValue){
                left.push(cur);
            }else{
                right.push(cur);
            }
        }
        return quickSort(left).concat([numValue],quickSort(right));
    }
console.log(quickSort(ary))

2. 插入排序

思路:
1.left=[45821,32]
2.拿數組中的每一項,跟左手中的每一項,從後往前的進行比較:
     如果比左手中的牌大,應該放在左手這張牌的後面(放在這張牌的下一張牌的前面)
     如果比左手中的牌小,,繼續往左邊比較,比較到索引===-1;還是小的話,插入到left最前面;
return  left;
代碼:
    var ary=[21,8,5,34,9];
    function insertSort(ary){
        //1.先給左手一張牌,這個牌數組中
        var left=ary.splice(0,1);
        //2.拿數組中的每一項跟左手中的每一項進行比較(從後往前的比較)
        for(var i=0; i<ary.length; i++){//數組
            var cur=ary[i];//數組中的每一項;
            for(var j=left.length-1; j>=0;){//4  左手
                var nex=left[j];//代表左手中的每一項;
                if(cur<nex){//數組中的某一項,比左手牌小;
                    j--;
                    if(j===-1){//說明已經比到左手第一張牌了,而且還比他小,應該插入左手第一張牌的最前面;
                        left.unshift(cur);
                    }
                }else{
                    left.splice(j+1,0,cur);
                    break;
                }
            }
        }
        return left;
    }

3. 冒泡排序

思路:
//var ary=[21,8,5,34,9];
第一輪:比較4次;雖然沒有實現最終目標,但是已經把最大值放在數組的末尾;
   [8,21,5,34,9]
   [8,5,21,34,9]
   [8,5,21,34,9]
   [8,5,21,9,34]
第二輪:比較3次;雖然沒有實現最終目標,但是把次大值數組的後面
   [5,8,21,9,34]
   [5,8,21,9,34]
   [5,8,9,21,34]
第三輪:比較2次;
  [5,8,9,21,34]
第四輪:比較1次;
第五輪:比較0次;
代碼:
var ary=[21,8,5,34,9];
for(var i=0; i<ary.length; i++){//比較的輪數
        for(var j=0; j<ary.length-i-1;j++){//比較多少次
            //每次比較都是拿當前項跟後一項進行比較;如果當前項大於後一項,他兩換位置
            if(ary[j]>ary[j+1]){
                var tmp=ary[j+1];
                ary[j+1]=ary[j];
                ary[j]=tmp;
            }

        }
    }
    console.log(ary);

遞歸算法

使用callee實現自己調用自己,金典遞歸 n!
function fact(num) {
      if (num <= 1) {
         return 1;
       } else {
         return num * arguments.callee(num - 1); //此處更改了。 
      }
   }
   var anotherFact = fact;
   fact = null;
   alert(antherFact(4)); //結果爲24.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章