javascript编程代码笔记

1. 快速排序算法

  1. 方法一

function quicksort(n,left,right){  var p;  if(left<right){
    p = position(n,left,right);
    quicksort(n,left,p-1);
    quicksort(n,p+1,right);
  }
}function position(n,left,right){  var temp = n[left];  while(left<right){    while(left<right&&n[right]>temp)
      right--;    if(left<right)
      n[left++]=n[right];    while(left<right&&n[left]<temp)
      left++;    if(left<right)
      n[right--]=n[left];
  }
  n[left]=temp;  return left;
}var a =[50, 32, 11, 16, 32, 24, 99, 57, 100];
quicksort(a,0,a.length-1)console.log(a);
  1. 方法二

function quickSort(arr,left,right){  var p;  if(left<right){
    p=position(arr,left,right);
    quicksort(arr,left,p-1);
    quicksort(arr,p+1,right);
  }  function position(arr,left,right){    var temp=arr[left];    while(left<right){      while(left<right&&arr[right]>temp) right--;      if(left<right) arr[left++]=arr[right];      while(left<right&&arr[left]<temp) left++;      if(left<right) arr[right--]=arr[left];
    }
    arr[left] =temp;    return left;
  }
}

2. 深度克隆clone(继承)

var cloneObj = function(obj){    var str, newobj = obj.constructor === Array ? [] : {};    if(typeof obj !== 'object'){        return;
    } else if(window.JSON){
        str = JSON.stringify(obj), //系列化对象
        newobj = JSON.parse(str); //还原
    } else {        for(var i in obj){
            newobj[i] = typeof obj[i] === 'object' ? 
            cloneObj(obj[i]) : obj[i]; 
        }
    }    return newobj;
};//测试var obj = {a: 0, b: 1, c: 2};var arr = [0, 1, 2];//执行深度克隆var newobj = cloneObj(obj);var newarr = cloneObj(arr);//对克隆后的新对象进行成员删除delete newobj.a;
newarr.splice(0,1);console.log(obj, arr, newobj, newarr);
结果: {a: 0, b: 1, c: 2}, [0, 1, 2], {b: 1, c: 2}, [1, 2];
*/

比如StringBuilder吧,length表示当前的StringBuilder能保持的字符数量。因为当StringBuilder达到最大容量的时候,它会将自身容量增加到当前的2倍再加2。

 

无论何时只要StringBuilder达到它的最大容量,它就不得不创建一个新的字符数组然后将旧的字符数组内容拷贝到新字符数组中—-这是十分耗费性能的一个操作。

 

试想,如果能预估到字符数组中大概要存放5000个字符而不指定长度,最接近5000的2次幂是4096,每次扩容加的2不管,那么:

(1)在4096 的基础上,再申请8194个大小的字符数组,加起来相当于一次申请了12290个大小的字符数组,如果一开始能指定5000个大小的字符数组,就节省了一倍以上的空间

(2)把原来的4096个字符拷贝到新的的字符数组中去

 

这样,既浪费内存空间又降低代码运行效率。所以,给底层以数组实现的集合、工具类设置一个合理的初始化容量是错不了的,这会带来立竿见影的效果。

 

但是,注意,像HashMap这种是以数组+链表实现的集合,别把初始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。

 

初始大小建议设置为2的N次幂,如果能估计到有2000个元素,设置成new HashMap(128)、new HashMap(256)都可以。

 
posted @ 2017-07-12 10:27  小小心脏  阅读(339)  评论(0编辑  收藏  举报