算法 去重,冒泡

131 阅读1分钟

算法之数组去重!!!!!

方法一:双for 循环比较

思路:依次拿出数组中的每一项,和后面的所有项进行比较,如果有相同的项就删除。

var ary = [1,1,1,3,5,5,6,6,2,2];
思路:
第一次拿出数组的第一项:1
                  给[1,1,3,5,1,6,6,2,2]比较有重复的就删除
第二次拿数组的第二项:1
                  给[1,3,5,1,6,6,2,2,]比较,重复删除
第三次拿数组的第三项:1
                  给[3,5,1,6,6,2,2]比较,重复删除....
        拿出数组的每一项给剩下的进行比较
         **注意:数组的最后一项可以不用拿出来比较,因为最后一项没有比较的,可以减少浏览器的负担**
         
 for(i=0;i<ary.length-1;i++){
    var unm = ary[i];
    for(j=i+1;j<ary.length;i++){
    var newUnm = ary[j];
    //如果当前项和后面的项比较的时候,相同就说明重复,然后进入if ary.splice(i,1)进行删除
      if(unm == newUnm ){
      ary.splice(i,1);
      //splice会造成数组塌陷问题,所以要用j--来解决
            j--;
      }
     }
   }
   console.log(ary)       

第二种 :利用对象属性名不重复

【实现的思路】利用对象属性名不重复的思想,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

/* 
var ary2=[1,2,1,3,3,2,3];

利用对象属性名不能重复的原理:对象中如果没有一个属性的时候就是undefined
把数组中的每一项作为一个对象的属性名和属性值
var obj={1:1,2:2,3:3} 
原理:如果对象属性中已经存在这个属性名,我们就把原数组中此项进行删除
*/
function unique(ary){
   var obj={};
   for(var i=0;i<ary.length;i++){
       var item=ary[i];
       if(typeof (obj[item])!="undefined"){
         //如果此时对象的此属性已经有了,我们就应该删除数组中的那一项
          ary.splice(i,1);
            i--;
          }else{
           obj[item]=item;
         }
      
   }
   return ary;
}
var res=unique(ary2);
console.log(res);


方法三:indexOf

创建要给新数组,遍历原数组,如果新数组没有哪一项的话,就把它push进去

/* 
  var ary2=[1,2,1,3,3,2,3];
  var newAry=[];
  把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组
*/

function unique(ary){
   var newAry=[];
   for(var i=0;i<ary.length;i++){
       var item=ary[i];
       if(newAry.indexOf(item)==-1){
        newAry.push(item);
       }
   }
   return newAry;
}
var ary2=[1,2,1,3,3,2,3];
var res=unique(ary2);
console.log(res);

算法 冒泡排序

   /* 
   冒泡排序:
   从小到大排序
   var ary=[8,2,1,5]
   原理:依次拿出数组中的每一项给后面的一项做对比,如果当前项比后面的项大就交换位置
   第一轮:[2,1,5,8] 经过一轮比较出现了最大数
   第二轮:[1,5,2,8] 经过二轮比较得出倒数第2个数
   第三轮:[1,5,2,8]  经过二轮比较得出倒数第3个数
   .... 总共四项,经过比三轮,已经得到了三个最大数了,最后一个自然就是最小数
   【需要比的总轮数】:ary.length-1;
   【每次需要比的次数】:ary.length-1-已经比较过的轮数

   第一轮:4项两两比较需要比3次:ary.length-1
   第二轮: 正常的ary.length-1-已经比较过的轮数
   
   */

   function sort(ary){
       // 需要比较的轮数
       for(var i=0;i<ary.length-1;i++){
           for(var j=0;j<ary.length-1-i;j++){
              var current=ary[j];
              var next=ary[j+1];
              if(ary[j]>ary[j+1]){
                 // 让 ary[j]=ary[j+1]
                 var temp=ary[j]
                 ary[j]=ary[j+1];
                 ary[j+1]=temp;
                    
              }
           }
       }
       return ary;
   }

   var ary=[8,2,1,5];
   var res=sort(ary);