亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

數(shù)據(jù)排序誰(shuí)最快(javascript中的Array.prototype.sort PK 快速排序)

 更新時(shí)間:2007年01月10日 00:00:00   作者:  
今天在51js論壇中看到一個(gè)網(wǎng)友發(fā)布了一個(gè)javasctipt實(shí)現(xiàn)的快速排序的算法,前些日子工作中也涉及到j(luò)avasctipt中數(shù)據(jù)排序的應(yīng)用,當(dāng)時(shí)為了提高排序速度,使用的也是快速排序的算法。

但是讓我感到意外的是,下面有個(gè)網(wǎng)友回復(fù)說(shuō),javascript中的Array本身的sort方法才是最快的,比快速排序算法都快,當(dāng)時(shí)看到了很是郁悶,因?yàn)楫?dāng)時(shí)花了好長(zhǎng)時(shí)間在排序算法上,居然忘記了Array本身的sort方法
不過(guò)javascript中內(nèi)置的sort方法真的比快速排序算法還快嗎?
哈哈,測(cè)試一下不就知道了
先說(shuō)一下我測(cè)試的環(huán)境
1,我的測(cè)試環(huán)境是IE6.0和firefox2.0
2,每種算法有很多種不同的實(shí)現(xiàn)方法,下面測(cè)試中我選擇上面網(wǎng)友實(shí)現(xiàn)的快速排序算法,只是把內(nèi)嵌函數(shù)搬到了外面
3,算法執(zhí)行的速度與數(shù)據(jù)的類(lèi)型、大小、數(shù)據(jù)量的多少都有關(guān)系,我這里只比較 小于 999999 的整數(shù)的排序,數(shù)據(jù)量分別定為500、2000、30000

關(guān)于sort方法:sort方法是Array的一個(gè)內(nèi)置的方法:javascript權(quán)威指南 中是這樣定義的:

The sort( ) method sorts the elements of array in place: no copy of the array is made. If sort( ) is called with no arguments, the elements of the array are arranged in alphabetical order (more precisely, the order determined by the character encoding). To do this, elements are first converted to strings, if necessary, so that they can be compared.
If you want to sort the array elements in some other order, you must supply a comparison function that compares two values and returns a number indicating their relative order. The comparison function should take two arguments, a and b, and should return one of the following:

sort方法可以接受一個(gè)function類(lèi)型的參數(shù)來(lái)自定義自己的排序邏輯,當(dāng)沒(méi)有提供參數(shù)的時(shí)候,默認(rèn)按照字符順序排序,所以對(duì)整數(shù)排序需要提供一個(gè)function類(lèi)型的參數(shù),本測(cè)試的調(diào)用方式如下:

array.sort(function(a,b){return a-b})

當(dāng)然如果要排序的整數(shù)位數(shù)相同,不提供參數(shù)返回的結(jié)果也是一樣的,測(cè)試一下就知道:

復(fù)制代碼 代碼如下:

<script>
alert( [3,4,5,11,1].sort())
alert([3,4,5,11,1].sort(function(a,b){return a-b}))
</script>

提示:可以先修改了再運(yùn)行
得到的結(jié)果是 [1, 11, 3, 4, 5],顯然不是我們要的結(jié)果
生成需要排序的數(shù)組,為了得到公正的結(jié)果我先隨機(jī)生成用于排序的數(shù)組,每次比較中兩種方法使用的數(shù)組都具有相同的元素,下面是生成隨機(jī)數(shù)組的代碼
復(fù)制代碼 代碼如下:

function random(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(random(m,n))
}
return resultArr;
}

快速排序算法的實(shí)現(xiàn),這個(gè)算法取自我看到的51js論壇上這個(gè)網(wǎng)友的實(shí)現(xiàn),代碼如下:
復(fù)制代碼 代碼如下:

function doSort(a,s,e)
{
if(s<e)
{
var pos=partition(a,s,e);
doSort(a,s,pos-1);
doSort(a,pos+1,e);
}
}
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;
}

Array.prototype.quickSort=function(){
doSort(this,0,this.length-1);
}

檢查結(jié)果是否正確使用array.join()來(lái)判斷, 性能測(cè)試代碼如下:
復(fù)制代碼 代碼如下:

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()));
}

直接調(diào)用pk函數(shù)就可以了,例如你要對(duì)300個(gè)元素的數(shù)組進(jìn)行排序性能比較,調(diào)用pk(300) 就可以了

完整的測(cè)試代碼如下:

測(cè)試結(jié)果
第一次 第一次 第一次(ms)
500個(gè)元素: ie6.0: sort: 38.3 39.05 39.05
quickSort: 8.6 8.6 9.4
ff2.0: sort: 3.1 3.15 3.9
quickSort: 4.7 4.7 3.15

2000個(gè)元素: ie6.0: sort: 200 203.2 203
quickSort: 40.6 43.6 43.8
ff2.0: sort: 18.8 18.6 18.8
quickSort: 18.6 15.6 15.6

30000個(gè)元素: ie6.0: sort: 10360 9765 9203
quickSort: 843 813 891
ff2.0: sort: 422 422 406
quickSort: 328 297 407
從結(jié)果中可以看到,
在ie6.0中快速排序算法比Array對(duì)象的sort方法快多了,對(duì)于元素比較少的,快速排序的速度基本上是sort方法的5倍左右,對(duì)于30000個(gè)元素快速排序是sort方法速度的十幾倍
在ff2.0中兩種排序算法速度基本上差不多,快速排序算法稍微快一點(diǎn),這也說(shuō)明ff2.0中Array對(duì)象的sort還是比較高效的,說(shuō)不定就是用的快速排序,因?yàn)樗焖倥判蛩惴ǖ臄?shù)據(jù)很接近
說(shuō)明:上面的測(cè)試只代表我本機(jī)上的測(cè)試結(jié)果,也許在你機(jī)器上結(jié)果會(huì)有很大的區(qū)別,希望大家也幫忙測(cè)試一下

相關(guān)文章

  • Js四則運(yùn)算函數(shù)代碼

    Js四則運(yùn)算函數(shù)代碼

    javascript的除法結(jié)果會(huì)有誤差,在兩個(gè)浮點(diǎn)數(shù)相除的時(shí)候會(huì)比較明顯。這個(gè)函數(shù)返回較為精確的除法結(jié)果
    2012-07-07
  • ie瀏覽器使用js導(dǎo)出網(wǎng)頁(yè)到excel并打印

    ie瀏覽器使用js導(dǎo)出網(wǎng)頁(yè)到excel并打印

    簡(jiǎn)單介紹一種可以使用簡(jiǎn)單的JS來(lái)實(shí)現(xiàn)把網(wǎng)頁(yè)中的信息原樣導(dǎo)出到Excel、還可以打印的方法,需要的朋友可以參考下
    2014-03-03
  • 分析 JavaScript 中令人困惑的變量賦值

    分析 JavaScript 中令人困惑的變量賦值

    分析 JavaScript 中令人困惑的變量賦值...
    2007-08-08
  • 微信小程序自定義漸變的tabbar導(dǎo)航欄功能

    微信小程序自定義漸變的tabbar導(dǎo)航欄功能

    這篇文章主要介紹了微信小程序自定義漸變的tabbar導(dǎo)航欄,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • JavaScript實(shí)現(xiàn)N皇后問(wèn)題算法謎題解答

    JavaScript實(shí)現(xiàn)N皇后問(wèn)題算法謎題解答

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)N皇后問(wèn)題算法謎題解答,N皇后問(wèn)題是指將N個(gè)皇后放置在NxN的國(guó)際象棋棋盤(pán)上,其中沒(méi)有任何兩個(gè)皇后處于同一行、同一列或同一對(duì)角線(xiàn)上,以使得它們不能互相攻擊,需要的朋友可以參考下
    2014-12-12
  • 淺析Bootstrap縮略圖組件與警示框組件

    淺析Bootstrap縮略圖組件與警示框組件

    縮略圖在網(wǎng)站中最常用的就是產(chǎn)品列表頁(yè)面,一行顯示幾張圖片,有的在圖片底下帶有標(biāo)題、描述內(nèi)容、按鈕等信息。本文給大家介紹Bootstrap縮略圖組件與警示框組件,感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • JS實(shí)現(xiàn)當(dāng)前頁(yè)居中分頁(yè)效果的方法

    JS實(shí)現(xiàn)當(dāng)前頁(yè)居中分頁(yè)效果的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)當(dāng)前頁(yè)居中分頁(yè)效果的方法,涉及javascript操作頁(yè)面元素與樣式的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 微信小程序?qū)崿F(xiàn)左滑刪除效果

    微信小程序?qū)崿F(xiàn)左滑刪除效果

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)左滑刪除效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 微信小程序日歷/日期選擇插件使用方法詳解

    微信小程序日歷/日期選擇插件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了微信小程序日歷和日期選擇插件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • javascript中substring()、substr()、slice()的區(qū)別

    javascript中substring()、substr()、slice()的區(qū)別

    在js中字符截取函數(shù)有常用的三個(gè)slice()、substring()、substr()了,下面我來(lái)給大家介紹slice()、substring()、substr()函數(shù)在字符截取時(shí)的一些用法與區(qū)別吧。
    2015-08-08

最新評(píng)論