关于数组排序
1.数组排序sort方法:
1 var arrNum = [1,9,14,0,-2]; 2 console.log(arrNum.sort(function(n1, n2){return n1-n2;})); //升序 3 console.log(arrNum.sort(function(n1, n2){return n2-n1;})); //降序
2.快速排序:
1 function quickSort(arr){ // 从大到小 2 if(arr.length <= 1){ //这个必须要,不然报堆栈溢出的错误 3 return arr; 4 } 5 var left = [], 6 right = [], 7 middle = []; 8 var middleValue = arr[Math.floor(arr.length / 2)]; 9 for(var i=0; i<arr.length; i++){ 10 if(arr[i] > middleValue){ 11 left.push(arr[i]); 12 }else if(arr[i] < middleValue){ 13 right.push(arr[i]); 14 }else{ 15 middle = arr[i]; 16 } 17 } 18 return [].concat(quickSort(left),middle,quickSort(right)); 19 } 20 var arr1 = [1, -100, 2000, 0, 1]; 21 console.log(quickSort(arr1)); // [2000, 1, 0, -100]
这里插播一条广告,我们来看一下下面的代码。如果 list 很大,下面的这段递归代码会造成堆栈溢出。
1 var list = ['1','2','3','1']; 2 var nextListItem = function(){ 3 var item = list.pop(); 4 console.log('item'+item); 5 if(item){ 6 nextListItem(); 7 } 8 }; 9 nextListItem();
那么,如何在不改变递归模式的前提下修缮这段代码呢?
修缮后代码如下:
1 var list = ['1','2','3','1']; 2 var nextListItem = function(){ 3 if(list.length > 0){ // 解决堆栈溢出的bug 4 var item = list.pop(); 5 console.log('item'+item); 6 } 7 if(item){ 8 nextListItem(); 9 } 10 }; 11 nextListItem();
函数调用的参数是通过栈空间来传递的,在调用过程中会占用线程的栈资源。而递归调用,只有走到最后的结束点后函数才能依次退出,而未到达最后的结束点之前,占用的栈空间一直没有释放,如果递归调用次数过多,就可能导致占用的栈资源超过线程的最大值,从而导致栈溢出,导致程序的异常退出。
所以这里造成递归堆栈溢出的主要原因是没有指定结束递归的条件!!!
3.冒泡排序:
1 function bubbleSort(arr){ // 从小到大 2 var temp; 3 for(var i=0; i<arr.length; i++){ 4 for(var j=0; j<arr.length; j++){ 5 if(arr[j] > arr[j+1]){ 6 temp = arr[j+1]; 7 arr[j+1] = arr[j]; 8 arr[j] = temp; 9 } 10 } 11 } 12 return arr; 13 } 14 var arr1 = [1, -100, 2000, 0, 1]; 15 console.log(bubbleSort(arr1)); // [-100, 0, 1, 1, 2000]