前端基本算法——冒泡、插排、快排

冒泡排序

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

基本原理
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

具体看冒泡算法

如图:
前端基本算法——冒泡、插排、快排_第1张图片

//看代码
<script type="text/javascript">
	function mPao(val){
		var com = null
		//外层循环控制的比较的轮数
		for (var i = 0; i < val.length-1; i++) {
		//内层循环控制的是每一轮比较的次数
			for(var j=0;j<val.length-1-i;j++){
				if(val[j]>val[j+1]){
					com = val[j]
					val[j]=val[j+1]
					val[j+1]=com
				}
			}
		}
		return val
	}
		let arr = [12,1,5,8,9,15]
		arr=mPao(arr)
		console.log(arr)   //1,5,8,9,12,15
</script>

插入排序

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。

基本思想
插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌

具体请看插入排序

如图:
前端基本算法——冒泡、插排、快排_第2张图片

//看代码
<script type="text/javascript">
	function crPxu(ary){
	//首先得准备一个空闲的手leftCon 准备去拿牌
		let leftCon = []
		//然后拿一张放在手里,目的是为了让新拿的牌和手里这张进行比较
		leftCon.push(ary[0])
		for (let i = 1; i < ary.length; i++) {
			//D是新抓的牌
			let D = ary[i]
			//然后和leftCon 手里的牌一次比较(从后向前比)
			for (let j = leftCon.length - 1; j >= 0; j--) {
				//每次要比较手里的牌
				let S = leftCon[j]
				//如果新牌D比 要和手里比较的牌S大的话,D放在S的后面
				if(D>S){
					leftCon.splice(j+1,0,D)
						break
					}
					//比到第一项,把新牌放到手中最前面即可
					if(j===0){
						leftCon.unshift(D)
					}
				}
			}
			return leftCon
		}
			let arr = [12,1,5,8,9,15]
			arr=crPxu(arr)
			console.log(arr)  //1,5,8,9,12,15
</script>

快速排序

快速排序(Quicksort)是对冒泡排序算法的一种改进。

具体请看快速排序

如图:
前端基本算法——冒泡、插排、快排_第3张图片

//看代码
<script type="text/javascript">
	function quick(val){
	//4.用来结束递归,如果数组的长度小于等于1,则返回val
		if(val.length<=1){
			return val
		}
	//1.找到数组的中间项
		let middleIndex = Math.floor(val.length/2)
	    //1.1 移除中间项
		let middleValue = val.splice(middleIndex,1)[0]
	//2.准备左右两个空数组,
		let leftVal =[],
			rightVal = [];
			//循环剩下数组中的每一项
			for(let i=0;i<val.length;i++){
			//比当前项小的放在左边数组中,反之放在右边数组中
			let item = val[i]
			item<middleValue?leftVal.push(item):rightVal.push(item)
			}
	//3.递归方式让左右两边的数组持续处理,一直到左右两边数组排好序,最后用concat,拼接成最后的结果
		return quick(leftVal).concat(middleValue,quick(rightVal))
}
		let arr = [12,1,5,8,9,15]
		arr=quick(arr)
		console.log(arr) //1,5,8,9,12,15
</script>

更多算法 ,这里为大家推荐一篇比较好的文章
值得收藏的十大经典排序算法

你可能感兴趣的:(js,javascript,算法)