前端常用算法总结
一、排序
冒泡排序
function sort1(arr){ for (var i = 0; i < arr.length; i++) { for(var j =0;j < arr.length-i;j++){ //两层循环,第一次循环把最大的数字放到最后,第二次把第二大的数字放到最后,以此类推 if(arr[j]>arr[j+1]){ var n = arr[j]; arr[j]=arr[j+1]; arr[j+1]=n; } } } } var a =[1,55,88,77,66,0,-33,99,456,-333]; sort1(a); console.log(a); //反向冒泡 function sort2(arr){ for(i=0;i< arr.length;i++){ for(j=arr.length-i;j>0;j--){ if(arr[j]>arr[j-1]){ var n = arr[j]; arr[j]=arr[j-1]; arr[j-1]=n; } } } } var a =[1,55,88,77,66,0,-33,99,456,-333]; sort2(a); console.log(a);
冒泡排序其实就是通过比较相邻位置的元素大小,如果左边比右边大,就交换位置,继续比较,实际上就是每轮比较都得出一个最大值(或者最小值)。然后通过n-1轮比较,就能得出一个排好序的序列(通过设置一个flag,当数组基本有序的时候其实不一定需要比较到n-1轮)
快速排序
function quickSort(arr){ if(arr.length<=1){ return arr; } var midindex = Math.floor(arr.length/2); var mid = arr.splice(midindex,1)[0]; var left=[]; var right = []; for(i=0;i< arr.length;i++){ if(arr[i]< mid){ left.push(arr[i]); }else{ right.push(arr[i]); } } return quickSort(left).concat(mid,quickSort(right)); } var a=[85, 24, 63, 45, 17, 31, 96, 50]; var b = quickSort(a); console.log(b)
快速排序简单来讲就是我们选定一个数,然后比它小的都放在它左边,大于等于它的都放在它右边,那么这个时候对这个数来讲他的位置已经排到了正确的地方了,接下来要做的就是在它的左右两边分别再进行类似操作。
数组去重
//方法1 Array.prototype.unique=function(){ var n = []; //新建一个数组 for(i=0;i< this.length;i++){ //遍历原数组 if(n.indexOf(this[i])==-1){ //如果新数组里面没有原数组的其中一项 //push进新数组 n.push(this[i]); } } //遍历完成,返回新数组 return n; } //方法2 Array.prototype.unique1=function(){ //新建一个哈希表和数组 var n =[]; var m ={}; for(i=0;i< this.length;i++){ //遍历原数组 if(!m[this[i]]){ //如果哈希表里不存在原数组第i项 //存入哈希表,值为true; //push进新数组 m[this[i]]=true; n.push(this[i]) } } return n; } //方法3 Array.prototype.unique2=function(){ var n = [this[0]]; for(i=1;i< this.length;i++){ //遍历原数组 //如果原数组的第i项查询首次出现的位置不是i,则为重复项 if(this.indexOf(this[i])==i){ n.push(this[i]) } } return n; } //方法4 Array.prototype.unique3=function(){ this.sort(); var re=[this[0]]; for(var i = 1; i < this.length; i++){ if( this[i] !== re[re.length-1]){ re.push(this[i]); } } return re; } var a =[1,2,3,4,55,99,1,4,88,77,55,44,4]; var b =a.unique2(); console.log(b);