zoukankan      html  css  js  c++  java
  • 归并排序(JS代码)

    归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
    如 设有数列{6,202,100,301,38,8,1}
    初始状态:6,202,100,301,38,8,1
    第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
    第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
    第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
     
    该算法采用经典的分治
    主要操作步骤:

    1:把长度为n的输入序列分成两个长度为n/2的子序列;

    2:对这两个子序列分别采用归并排序;

    3:将两个排序好的子序列合并成一个最终的排序序列。

    Array.prototype.mergeSort = function() {
    	let merge = function(left, right) {
    		let resArr = []
    		while(left.length && right.length) {
    			// 这里shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
    			if(left[0] < right[0]) {
    				resArr.push(left.shift())
    			}else {
    				resArr.push(right.shift())
    			}
    		}
    		return resArr.concat(left , right)
    	}
    	let mSort = function(arr) {
    		let len = arr.length
    		if (len < 2) {
    			return arr
    		}
    		let index = Math.floor(len / 2),
    		    left = arr.slice(0,index), //得到下标从0~index-1的数组
    		    right = arr.slice(index)  //得到下标从index开始到末尾的数组
    		return merge(mSort(left) , mSort(right))  //里面采用递归
    	}
    	// 这里this不能直接赋值数组,我们就只能采取splice剪切数组再替换新的
    	this.splice(0, this.length, mSort(this))
    }
    let arr = [2,9,5,7,1,1,6,3,3,4]
    arr.mergeSort()
    console.log("排序后:", arr.toString())
    // 1,1,2,3,3,4,5,6,7,9
    

      

  • 相关阅读:
    ES6扩展
    javascript当中prototype用法
    三列浮动中间宽度自适应
    介绍axios和promise
    JS高级---实例对象和构造函数之间的关系
    JS-数组常用方法整理
    原生JS轮播图
    JavaScript 开胃菜
    JS高级---遍历DOM树
    JS高级---正则表达式练习身份证号码
  • 原文地址:https://www.cnblogs.com/bobo1/p/12502866.html
Copyright © 2011-2022 走看看