通俗易懂之JS算法

冒泡排序

解析:
1.比较相邻的两个元素,如果前一个比后一个大,则交换位置。

2.第一轮的时候最后一个元素应该是最大的一个。

3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。(每次遍历都会把此次遍历最大的数放在最后,一直到最开始的数)

function sort(arr){
		for(var i=0;i<arr.length-1;i++){  //对数组进行循环处理
			for(var j=0;j<arr.length-i-1;j++){	//嵌套循环 用剩余的数和最外层的数最对比
				if(arr[j]>arr[j+1]){	
					var max=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=max 		//内循环的数大于外循环的数,交换这两个数的位置,最后这个数组就是从小到大的排序
				}
			}
		}
	}

快速排序

解析:
冒泡排序升级版,首先找到中间的数,然后以中间的数为参考,把数组分为左边和右边两个数组 左边的小于中间数,右边的大于中间数,然后进行递归重复上边的操作,把左右两个数组也进行排序 ,最后合并整个所有的数组

例子:
	6  1  2  5  9  3  4  7  10  8
		第一次排序后
	3  1  2  5  4  6  9  7  10  8
	左边为 3  1  2  5  4   右边为  9  7  10  8
		重复排序后
	左边为 1 2 3 5 4	右边为 9  7  8  10
		再次排序后
	左左为 1 2   左右为5 4 	右左 7  右右 9 10
		最后排序
	左左为 1 2   左右为4 5 	右左 7  右右 9 10
			最后合并
		1 2 3 4 5 6 7 8 9 10
function  quickSort(elements) {
	if (elements.length <= 1) { 
		return elements;  //判断数组是否为空
	 }
 
    var pivotIndex = Math.floor(elements.length / 2);//四舍五入取数组中间值的下标
 
    var pivot = elements.splice(pivotIndex, 1)[0];//获取去掉中间值后的数组


  var left = [];  //左侧放小于中间值的值
 
  var right = [];//右侧放大于中间值的值
 
  for (var i = 0; i < elements.length; i++){  
 
    if (elements[i] < pivot) {
 
      left.push(elements[i]);
 
    } else {
 
      right.push(elements[i]);
 
    }
 
  }
  //此时第一次结果已经出来了,left为小于中间值的数组,right为大于中间值的数组,
 
  return quickSort(left).concat([pivot], quickSort(right));//然后在使用递归,不断地把left / right数组排序,最后在拼接起来
 
};
 
var elements=[5,6,2,1,3,8,7,1.2,5.5,4.5];
alert(quickSort(elements));  //1,1.2,2,3,4.5,5,5.5,6,7,8

插入排序

即假设数组第一个数是已经被排过序的,放入新数组中,之后拿每个数和已经排过序的新数组的每个数做比较,如果大于就在该数后插入,如果小于就在该数前插入

(1) 从第一个元素开始,该元素可以认为已经被排序

(2) 取出下一个元素,在已经排序的元素序列中从后向前扫描

(3) 如果该元素(已排序)大于新元素,将该元素移到下一位置

(4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

(5)将新元素插入到下一位置中

(6) 重复步骤2

二分查找

首先判断一个区间,然后在区间里进行循环,找到了就返回下标,没找到就减小区间,直到无法循环 返回-1
//首先找到数组的左右区间
	var p=33 //要查找的元素
	var arr=[1,2,3,4,5]
	var left=0;//左区间端点
	var right=arr.length-1;//右区间端点
	while(left<=right){
    	var mid=left+(right-left)/2;//区间正中间的下标
    	if(p==arr[mid]){
        	return mid  //找到了就返回
    	}else if(p>arr[mid]){
        	left=mid+1; //没找到就判断并修改区间范围
    	}else{
        	right=mid-1
    	}
	}
 	return -1   //循环结束还没找到就返回-1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值