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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章