咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          快速排序 (轉(zhuǎn))

          Posted on 2009-06-17 12:10 oathleo 閱讀(1302) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Web
          在ie6.0中快速排序算法比Array對(duì)象的sort方法快多了,對(duì)于元素比較少的,快速排序的速度基本上是sort方法的5倍左右,對(duì)于30000個(gè)元素快速排序是sort方法速度的十幾倍
          在ff2.0中兩種排序算法速度基本上差不多,快速排序算法稍微快一點(diǎn)

          <script>
          function rand(m,n){
          ????? //生成一個(gè)m、n之間的整數(shù)
          ??????? var i=Math.random();
          ??????? return Math.round((n-m)*i+m);
          ?}
          ?????????? ?
          ?????????? ?
          function getRandomArr(m,n,l){
          ? //m:生成隨即整數(shù)的最小值,n:生成隨即整數(shù)的最大值,l:生成的數(shù)組的長(zhǎng)度
          ??? var resultArr=[];
          ??? for(var i=0;i<l;i++){
          ??????? resultArr.push(rand(m,n))
          ??? }
          ??? return resultArr;
          }
          ??? ?
          function partition(a,st,en) ?
          { ?
          ??? var s=st; ?
          ??? var e=en+1; ?
          ??? var temp=a[s]; ?
          ??? while(1) ?
          ??? { ?
          ??????? while(a[++s]<temp); ?
          ??????? while(a[--e]>temp); ?
          ??????? if(s>e)break; ?
          ??????? var tem=a[s]; ?
          ??????? a[s]=a[e]; ?
          ??????? a[e]=tem; ?
          ??? } ?
          ??? a[st]=a[e]; ?
          ??? a[e]=temp; ?
          ??? return e; ?
          } ?

          function doSort(a,s,e) ?
          { ?
          ??? if(s<e) ?
          ??? { ?
          ??????? var pos=partition(a,s,e); ?
          ??????? doSort(a,s,pos-1); ?
          ??????? doSort(a,pos+1,e); ?
          ??? } ?
          } ?
          ??? ?
          Array.prototype.quickSort = function() ?
          { ?
          ????? doSort(this,0,this.length-1); ?
          }


          function sortIntF(a,b){return a-b}
          function pk(num){
          ??? //num: 用于排序的數(shù)組的元素個(gè)數(shù)
          ??? //生成用于排序的數(shù)組
          ??? var arr=getRandomArr(1,999999,num);
          ??? ?
          ??? //當(dāng)元素個(gè)數(shù)小于10000時(shí),執(zhí)行n次取平均值 ?
          ??? var n=Math.ceil(10000/num);
          ??? ?
          ??? //生成多個(gè)用于排序的數(shù)組的拷貝
          ??? var quickSortArrs=[];
          ??? var sortArrs=[];
          ??? for(var i=0;i<n;i++){
          ??????? quickSortArrs.push(arr.slice(0));
          ??????? sortArrs.push(arr.slice(0));
          ??? }
          ??? ?
          ??? var t1=new Date();
          ??? ?
          ??? for(var i=0;i<n;i++){
          ??????? quickSortArrs[i].quickSort();
          ??? }
          ??? ?
          ??? var t2=new Date();
          ??? ?
          ??? for(var i=0;i<n;i++){
          ??????? sortArrs[i].sort(sortIntF);
          ??? }
          ??? ?
          ??? var t3=new Date();
          ??? ?
          ??? alert("性能比較,對(duì)于"+num+"個(gè)元素的數(shù)組,平均每次排序花費(fèi)時(shí)間如下:\n"
          ??? +"Array.prototype.sort:"+((t3-t2)/n)+"ms\n"
          ??? +"quickSort:"+((t2-t1)/n)+"ms\n"
          ??? );
          ??? ?
          ??? alert("排序結(jié)果是否正確:"+(sortArrs[0].join()==quickSortArrs[0].join()));
          }

          pk(500);
          pk(2000);
          pk(30000);
          </script>
          主站蜘蛛池模板: 当雄县| 永平县| 杭州市| 庄河市| 六枝特区| 从江县| 平南县| 鄂托克前旗| 陇南市| 兴安县| 磴口县| 彰武县| 昌乐县| 金溪县| 漳州市| 阿坝| 修武县| 济阳县| 尼玛县| 泰兴市| 台湾省| 曲靖市| 通州区| 进贤县| 筠连县| 仙居县| 万源市| 敦煌市| 长兴县| 枝江市| 汉阴县| 山西省| 泌阳县| 雅江县| 阿拉尔市| 新巴尔虎左旗| 仁化县| 长垣县| 莱西市| 扎赉特旗| 台北县|