一. 冒泡排序
总体思想就是:
第一轮:数组里的第二项到最后一项,都和第一项进行比较,如果比第一项小,两者就交换;最后比较完,第一项就是最小的;
第二轮:数组里的第三项到最后一项,,都和第二项进行比较,如果比第一项小,两者就交换;最后比较完,第二项就是最小的;
以此类推……..

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   |  Array.prototype.bubbleSort = function(){ 	var length = this.length; 	for(var i=0;i<this.length;i++) 	{ 		for(var j=i+1;j<this.length;j++) 		{ 			if(this[j]<this[i]) 			{ 				var mid = this[i]; 				this[i] = this[j]; 				this[j] = mid; 			}  		} 	} 	return this; }
  var arr = [1,5,3,7,9,4,23,100,79,0]; console.log(arr.bubbleSort());
 
  | 
 
二. 选择排序
和冒泡算法相比,它的好处是是不用每比较一次就换一次位置。比如在冒泡算法中,如果arr[3]<arr[0],这时候会换一次;但同时如果arr[5]比他俩都小,那还会再交换一次;这样下来每进行一次外部循环会进行很多步的交换操作。选择排序避免了这个问题,每一次外部的循环只需要交换一次。

思想:每一次外部循环找出当前范围内最小值的index,然后进行交换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   |  Array.prototype.selectSort = function(){ 	for(var i=0;i<this.length;i++){ 		var index=i;
  		for(var j=i+1;j<this.length;j++){ 			if(this[j]<this[index])		 			{ 				index = j; 			} 		}
  		var mid = this[index]; 		this[index] = this[i]; 		this[i] = mid; 	}
  	return this;
  }
  var arr = [1,5,3,7,9,4,23,100,79,0]; console.log(arr.selectSort());
 
  | 
 
三. 插入排序
思想:只进行一次遍历;遍历到第i个元素的时候,确保这个元素之前的所有元素是排好序的;即对于第i个元素。在前i-1个元素中找好位置,然后插入到正确的位置。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | Array.prototype.insertionSort = function(){
  	for(var i =1;i<this.length;i++){ 		var temp = this[i]; 		j = i; 		while(j>0&&temp<this[j-1]){		 			 			 			 			 			this[j] = this[j-1];			 			j--; 		} 		this[j]=temp;
  	}
  	return this; 	 }
  var arr = [5,1,23,3,7,9,4,100,79,0]; console.log(arr.insertionSort());
  | 
 
四. 归并排序(快速排序)
归并算法分两种,一种使用中间项的值来分割,一种使用中间项的index来分割;其实思路是一样的,都是使用递归;我比较喜欢第一种,思路简单,直接按大小分的组;
递归就是一个,从最初开始一直一直调用自己,但是一直没有运算;一直到分到不能再继续调用自己了,这时开始运算,并一步一步往回算;
- 使用中间项的值 : 
 
找出中间项的值,把比他小的放到左边的数组里,比他大的放到右边的数组里,之后合并;然后对左边和右边的数组递归调用此方法;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | Array.prototype.mergeSort = function(){ 	 		if(this.length<=1){ 			return this; 		} 		var midIndex = Math.floor(this.length/2);
  		var left = []; 		var right = []; 		var mid = [];
  		for(var i=0;i<this.length;i++){ 			if(this[i]<this[midIndex]){ 				left.push(this[i]); 			}else if(this[i]>this[midIndex]){ 				right.push(this[i]) 			}else if(this[i] == this[midIndex]){ 				mid.push(this[i]) 			} 		}
  		return Array.prototype.mergeSort.call(left).concat(mid,Array.prototype.mergeSort.call(right))
  }
  var arr = [5,1,3,23,2]; console.log(arr.mergeSort());
  | 
 
- 使用中间项的index
 
思路如下

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
   | var mergeSortRec = function(array){ 	var length = array.length; 	if(length == 1){ 		return array; 	}
  	var mid = Math.floor(length/2); 	var left = array.slice(0,mid); 	var right = array.slice(mid,length);
  	var merge = function(left,right){		 		var result = []; 		il = 0; 		ir = 0;
  		while(il<left.length&&ir<right.length){ 			if(left[il]<right[ir]){ 				result.push(left[il++]); 			}else{ 				result.push(right[ir++]); 			} 		}
  		while(il<left.length){ 			result.push(left[il++]) 		} 		while(ir<left.length){ 			result.push(right[ir++]) 		} 		console.log(result);
  		return result; 	}
  	return merge(mergeSortRec(left),mergeSortRec(right));
  } console.log(mergeSortRec([2,5,1,8,3]));
  |