对选择法和冒泡法的一些见解

  之前对选择法和冒泡法的概念有点犯晕,秉着死记的心思去学它。今天看对象的时候,不小心看到排序,就静下心来回忆选择法和冒泡法的代码,记忆细胞实在不给力,基本上忘光了。哎,本人对此有强迫症,就开始分析实现方式,所以就有了下面的代码。

  先做一个说明,选择法和冒泡法的主要作用是将数组升序或者降序,我这里着重讲解降序,写下以下数组。

var array = [10,4,1,9,2];

一、选择法(降序)

  先附上代码:

for(var i=0;i<array.length - 1;i++){ /* i表示比较数下标,array[i]表示比较数 */
    for(var j=i+1;j<array.length;j++){ /* j表示被表比较数下标,array[i]为被比较数 */
        if(array[i]>array[j]){
            var t = array[i];
            array[i] = array[j];
            array[j] = t;
        }
    }
}

  实现方式:是将比较数与被比较数(后面所有数)进行比较,如果array[0]>array[1|2|3...],则两者交换位置,反之位置不变,看下图。

  总结:循环总次数是数组array的长度,array[i]表示比较数,第一次循环从第一个数开始比较,第二次循环从第二个数开始比较,依次类推……array[j]表示被比较数,循环完一次(i增加1),被比较数就少一次,被比较数总是比较数后面的数(因为不需要和自己比较)。i循环的第n - 1次已经比较出数据了,不需要比较到第n次。即使i比较到第n次,j循环也满足不了j循环条件,(j = n + 1)j是大于数组长度的,也不会继续往下执行了。

  总归老说,选择法比较方式就是:

  第一个数和后面所有数比较;(第一次循环)

  第二个数和后面所有数比较;(第二次循环)

  第三个数和后面所有数比较;(第三次循环)

  ……

  第n-1个数和后面所有数比较;(第n-1次循环)

二、冒泡法(降序)

  先附上代码:

for(var i=0;i<array.length - 1;i++){
    for(var j=0;j<array.length - 1 - i;j++){
        if(array[j]>array[j+1]){
            var t = array[j];
            array[j] = array[j+1];
            array[j+1] = t;
        }
    }
}

  实现方式:冒泡法和选择法不一样的地方在,和选择法不一样的是它没有比较数和被比较数之分,因为里面的数既是比较数又是被比较数。冒泡法在循环中,第一个数和第二个数比较,第二个数和第三个比较,第三个数和第四个数比较……依次类推。如下图:

  总结:循环总次数是数组array的长度,第一次循环中,比较4次,第4次时已经找到最大最小值了,不需要再比较第5次;第二次循环中,比较3次;第三次循环中比较2次……。比较次数逐渐减少,冒泡冒泡,表示大的数都已经冒出来了,不需要比较了。循环一次,出来一个大的,再循环,再出来一个大的……依次类推,比较次数为array.length-n - 1。

  总归老说,冒泡法比较方式就是:

  第一个数和第二个数,第二个数和第三个……;(第一次循环,比较次数为array.length - 1)

  第一个数和第二个数,第二个数和第三个……;(第二次循环,比较次数为array.length-2)

  第一个数和第二个数,第二个数和第三个……;(第三次循环,比较次数为array.length-3)

  ……

  第一个数和第二个数,第二个数和第三个……;(第n次循环,比较次数为array.length-n - 1)

三、将冒泡法封装成组件(封装方式一样,就封装一个)

Function.prototype.method = function(name,func){ /* 将method方法加入到原型中(类似全局方法) */
        this.prototype[name] = func;
        return this;
    }
    /* 数组升序 */
    Array.method("sortUp",function(){
        var own = this;
        /* 冒泡法 */
        for(var i=0;i<own.length - 1;i++){
            for(var j=0;j<own.length - 1 - i;j++){
                if(own[j]>own[j+1]){
                    var t = own[j];
                    own[j] = own[j+1];
                    own[j+1] = t;
                }
            }
        }
        return own;
    })
  /* 数组降序 */ Array.method(
"sortDown",function(){ var own = this; /* 冒泡法 */ for(var i=0;i<own.length - 1;i++){ for(var j=0;j<own.length - 1 - i;j++){ if(own[j]<own[j+1]){ var t = own[j]; own[j] = own[j+1]; own[j+1] = t; } } } return own; })

  在html中调用此方法:

var array = [10,4,1,9,2];
console.log(array.sortUp()); /* 升序,输出[1,2,4,9,10] */
console.log(array.sortDown()); /* 降序,输出[10,9,4,2,1] */

三、数组去重

                var array = [2,2,3,1,2,4,5,6,6,7,"1",1,9],
                        hash = {},newArray = [],i = 0, perfix = "";
                for(i = 0; i < array.length; i++){
                    if(typeof array[i] == "string"){ /* 判断数组内容是字符串还是number */
                        perfix = "_str";
                    }else{
                        perfix = "";
                    }
                    if(!hash[array[i] + perfix]){
                        hash[array[i]] = true;
                        newArray.push(array[i]);
                    }
                }

  最后,非常感谢大家能够看完。有哪里讲解的不好或者是不正确的地方,希望大家能第一时间反馈给我,希望和大家共同进步,谢谢~

 

posted @ 2014-03-28 16:08  tattoos  阅读(7131)  评论(13编辑  收藏  举报