7、数组去重和排序
一、数组去重
/** * 数组去重 * 1、双循环法-判断有无相等项 * 注意:第二个循环要从 i+1 开始 * */ let circleRepeat = function (ary) { for(let i=0;i<ary.length;i++){ let cur = ary[i]; for(let j=i+1;j<ary.length;j++){ if(cur === ary[j]){ ary.splice(j,1); j--; } } } return ary }; // console.log(circleRepeat([1,2,3,4,1,1,2,2,3,4,4])); /** * 数组去重 * 2、新数组法-新数组没有当前项-放入新数组 * 注意:indexOf 用法 * */ let newArrRepeat = function (ary) { let ary2 = []; for(let i=0;i<ary.length;i++){ let cur = ary[i]; if(ary2.indexOf(cur) === -1){ ary2.push(cur); } } return ary2 }; // console.log(newArrRepeat([1,2,3,4,1,1,2,2,3,4,4])); /** * 数组去重 * 3、sort排序法-排序后判断相邻两项是否相等 * 注意:sort用法和防止数组塌陷 * */ let sortRepeat = function (ary) { ary.sort(function (a,b) { return a-b; }); for(let i=0;i<ary.length;i++){ if(ary[i] === ary[i+1]){ ary.splice(i,1); i--;//预防数组塌陷 } } return ary; }; // console.log(sortRepeat([1,2,3,4,1,1,2,2,3,4,4])); /** * 数组去重 * 4、对象法-看对象中是否有重复的,如果有,删除数组该项 * 注意:对象的属性名与属性值 * */ let objRepeat = function (ary) { let obj={}; for(let i=0; i<ary.length; i++){ let cur=ary[i]; if(obj[cur]==cur){ ary.splice(i,1); i--; } obj[cur]=cur; } return ary; }; // console.log(objRepeat([1,2,3,4,1,1,2,2,3,4,4])); /** * 数组去重 * 5、对象不重名特性-利用对象不重名的特性 不仅可以去重-属性名;而且属性值还记录了当前元素出现的次数 * 注意:对象的属性名与属性值 * */ let objNameRepeat = function (ary) { let obj={},ary2=[]; for(let i=0; i<ary.length; i++){ let cur=ary[i]; /*if(obj[cur]){ obj[cur]++; continue; } obj[cur]=1; //给对象添加数组中的该项内容,并赋值为1;*/ if(obj[cur]){ obj[cur]++; }else{ obj[cur]=1; } } return obj; }; // console.log(objNameRepeat([1,2,3,4,1,1,2,2,3,4,4]));
二、数组排序
/** * 快速排序 * 1、找中间位置及对应的值 * 2、数组中的每一项与中间值比较 left[] right[] * 3、递归+数组拼接 * */ let quickSort = function (ary) { if(ary.length<=1){ return ary } let num = Math.floor(ary.length/2); let numValue = ary.splice(num,1)[0]; let left = [],right = []; for(let i=0;i<ary.length;i++){ let cur = ary[i]; if(cur<numValue){ left.push(cur) }else { right.push(cur) } } return quickSort(left).concat([numValue],quickSort(right)) }; // console.log(quickSort([2,43,7,89,0,6,4,2,5,6])) /** * 插入排序 * 1、取数组第一项对应的值作比较。 * 2、循环原数组与left数组 * 3、原数组当前项小于left中每一项,放到left最前面。 * 4、原数组当前项大于left中其中某一项,放到此项后面。 * 5、返回left * */ let insertSort = function (ary) { let left = ary.splice(0,1); for(let i=0;i<ary.length;i++){ let cur = ary[i]; for(let j=left.length-1;j>=0;){ if(cur<left[j]){ j--; if(j == -1){ left.unshift(cur); } }else { left.splice(j+1,0,cur); break; } } } return left }; // console.log(insertSort([2,43,7,89,0,6,4,2,5,6])) /** * 冒泡排序 * 1、第一个循环--> 数组的长度=比较的轮数 ary.length * 2、第二个循环--> 每轮比较的次数 ary.length-1-i(最后一项不用比较) * 3、每次比较把较大值放到后面-->每轮比较最大值放到了最后 * 4、返回数组 * */ let bubbleSort = function (ary) { for(let i=0;i<ary.length;i++){ for(let j=0;j<ary.length-1-i;j++){ if(ary[j]>ary[j+1]){ let tmp = ary[j+1]; ary[j+1] = ary[j]; ary[j] = tmp; } } } return ary }; // console.log(bubbleSort([2,43,7,89,0,6,4,2,5,6]));