Maxpsc / Daily-Record

My daily blog about one day's summary

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

#天天小记 最近10天内容 ##2017.2.4 ###温习数组排序的各种方法 以下以升序为例,使用JS实现:
冒泡排序:通过两两比较,左边若大于右边数字,则左右交换,最小的数字可通过不断交换,“冒泡”到最右边

function bubbleSort(arr){
	if(arr.length<=1){return arr;}

	for(var i = arr.length;i>0; i--){
		for(var j = 0;j<i;j++){
			var left = arr[j];
			var right = arr[j+1];
			if(left > right){
				arr[j] = right;
				arr[j+1] = left;
			}
		}
	}
	return arr;
}

快速排序:取数组中间数字,遍历其他数字,若小于则放在左边数组,大于或等于则放在右边数组,以此递归,将小数组依次拼接成排好序的数组

function quickSort(arr){
	if(arr.length<=1){return arr;}

	var halfIndex = Math.floor(arr.length / 2);
	var halfNum = arr.splice(halfIndex,1)[0];
	var left = [];
	var right = [];
	arr.forEach(function(num){
		if(num < halfNum){
			left.push(num);
		}else{
			right.push(num);
		}
	});

	return quickSort(left).concat(halfNum,quickSort(right));
}

插入排序:将没排好的数字依次与排好数组中的数字比较,若小于则插到其前面,否则继续比较直到放到最后

function insertSort(arr){
	if(arr.length<=1){return arr;}

	var res = [arr[0]];
	for(var i=1;i<arr.length;i++){
		var cNum = arr[i];
		for(var j=0;j<res.length;j++){
			var num = res[j];
			if(cNum<num){
				res.splice(j,0,cNum);
				break;
			}
			if(j==res.length-1){
				res.push(cNum);
				break;
			}
		}
	}
	return res;
}

选择排序:每一次将待排序中最小数取出,放到已排序的最后一个

function selectSort(arr){
	if(arr.length<=1){return arr;}
	for(var i=0;i<arr.length;i++) {
		var min = arr[i];
		for (var j=i+1;j<arr.length;j++) {
			if(arr[j]<min) {
				var temp = min;
				min = arr[j];
				arr[j] = temp;
			}
		}
		arr[i] = min;
	}
	return arr;
}

Js自带: Array.sort()

function sortNumber(a,b){
	return a-b;
}
console.log([1,10,2,40,3].sort(sortNumber));//[1,2,3,10,40]

###将url参数解析为key:value型的obj

function urlQuery(url){
	url = url==null ? window.location.href : url;
	var queryArr = url.substring(url.lastIndexOf("?")+1).split("&");
	var res = {};
	queryArr.forEach(function(item,index){
		var param = item.indexOf("=");
		var key = decodeURIComponent(item.substring(0,param));
		var val = decodeURIComponent(item.substring(param+1));
		key ? (res[key] = val) : null;
	})
	console.log(res);
	return res;
}

##2017.2.6 ###手写Function.bind函数 bind函数核心:改变函数上下文this,
关注点:保持this,arguments,返回值

MDN的标准polyfill

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5
      // internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP
                                 ? this
                                 : oThis || this,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}

About

My daily blog about one day's summary