基础算法小结

看了一部分排序,去重算法,也对自己有个小结,如果有新的算法,再更新。


插入排序:

基本思想:开始将数组分为有序数组和无序数组两部分,有序数组初始化长度为1(从原来数组中随机拿一个),那么肯定是有序的。之后,从后往前遍历有序数组与无序数组中第一个元素比较,如果有序数组中值大,那么将有序数组位置向后+1,若比较完成找到合适的位置,插入无序数组第一个元素。

//插入排序
		var arr=[5,4,66,12,511,9,14,4,6,44,11,13];
		for(var i=0;i<arr.length;i++){ 		        //从arr[1]开始,那么无序数组初始化为arr
			var j;					//保存有序数组位置
			var temp=arr[i];			//得到无序数组中第一个元素
			for(j=i-1;j>=0&&temp<arr[j];j--){	//从后往前遍历有序数组,与无序数组第一个元素进行比较
				arr[j+1]=arr[j];		//将有序数组位置向后+1
			}
			arr[j+1]=temp;				//找到合适位置插入值
		}
		console.log(arr)



快速排序:

基本思想:从数组中找到一个值(一般是中间值,比较好理解arr[arr.length/2])作为基点,使用splice将基点从数组分离出来。将原数组中比基点小的数放在新数组left[ ]中,比基点大的或者等于的数放在新数组right[]中。反复使用上面步骤(其实就是一个递归运用),知道每个子数组的length=1的时候return,最后得到排序好的数组。

//快速排序
		var arr=[5,4,66,12,511,9,14,4,6,44,11,13];
		function fSort(arr){
			if(arr.length<=1){			//递归函数设置执行条件,并返回值
				return arr;
			}
			var numIndex=Math.floor(arr.length/2);  //找到基点位置
			var num=arr.splice(numIndex,1)[0];	//保存基点位置的具体值,并将基点从原数组中删除
			var left=[];				//新建数组left
			var right=[];  				//新建数组right
			for(var i=0;i<arr.length;i++){		//遍历数组,将比基地值小的放在left[],其他的放在right[]
				if(arr[i]<num){
					left.push(arr[i]);
				}else{
					right.push(arr[i]);
				}
			}
			return fSort(left).concat([num],fSort(right));//设置递归函数,最后拼接新函数
		}
		var x=fSort(arr);
		console.log(x)

冒泡排序:

基本思想:遍历数组,将数组中的数两两比较,若arr[i]>arr[i+1]那么将其交换位置。一遍下来,数组中最大的数将在最右边,然后重复使用上面算法,实现数组排序。

//冒泡排序
		var arr=[5,4,66,12,511,9,14,4];
		for(var k=1;k<arr.length;k++){ 		        //外层循环控制一共需要执行几次下面算法
			for(var i=0;i<arr.length-k;i++){	//内层函数控制将数组中最大数向后移动至末尾
				if(arr[i]>arr[i+1]){
					arr[i]+=arr[i+1];
					arr[i+1]=arr[i]-arr[i+1];
					arr[i]=arr[i]-arr[i+1];
				}
			}
		}



数组去重:

基本思想:建立新数组hash[ ](本质为关联数组),遍历原数组,将原数组每个元素作为对象在hash[ ]中查询,若结果为undefined将元素作为新的对象进入hash[ ],若其查询到,将hash[ ]中,对应对象值+1。最后遍历hash[ ]数组,将对象作为值赋值给arr,达到去重复。

//hash数组去重复
		var arr=[5,1,2,3,3,3,4,5,5,4,4,2,3,12,32,21,2,11,21,12];
		function del(arr){
			var hash=[];					//建立数组hash[]
			for(var i=0;i<arr.length;i++){	                //遍历原数组
				if(hash[""+arr[i]]==undefined){	        //将原数组每个元素作为对象在hash[]中查询
					hash[arr[i]]=1;			//若结果为undefined将元素作为新的对象进入hash[],初始化值为1
				}else{
					hash[arr[i]]++;			//若其查询到,将hash[]中,对应对象值+1
				}
			}
			arr=[];					         //初始化数组
			for(var key in hash){
				arr.push(key-=0);		        //将对象作为值赋值给arr,(key-=0)利用隐式转化将字符串转化为数字
			}
			return arr;
		}
		del(arr);

递归算法:

基本思想:这里采用数学阶乘的来说明,6!=1*2*3*4*5*6  转化为递归思路  6!=6*(x= 5*(x= 4*(x= 3*(x= 2*(x= 1)  ) ) ) )

x的意思是分别代表下面所有式,意思是当开始的时候,6*5,发现5是一个函数,于是用X代表返回值,所以表达成6*5=6*X,X内的函数将其转化为5*4,发现4是一个函数于是转化为4*X......最后得到的方式就是:6!=6*5*4*3*2*1

                function factory(num){
		       if(num==1){       //设置最后递归结束条件
				return num;
		       }else{
				num=num*factory(num-1); //使用递归原理
				return num;
			}
		}
		x=factory(6);
		console.log(x);







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值