推奨プログラムに従って IE で実行したところ、ソート時間は非常に短くなりました。
<script> <br> * シャッフル <br>*/ <br>function getRandomPlayCard(m){ <br>var array1=new Array(m); <br>for(var i=0;i<m;i ){ <BR>var rnd=Math.floor(Math.random()*(i 0.99999)) <BR>array1[i]=array1[rnd]; <BR>array1[rnd]=i; array1; <BR>}; <BR>/* <BR>* 属性または「並べ替え基準を取得する関数」による並べ替え。 @param {array} arr 処理対象の配列<BR>* @param {string|function} prop 属性でソート、get<BR>* @param {boolean} desc 降順<BR>* @return {array} ソートを返す<BR>*/ <BR>var sortBy =function (arr, prop, desc){ <BR>var props=[], <BR>ret=[], <BR>i=0, <🎜 の後の新しい配列>len=arr.length; <BR>if(typeof prop=='string') { <BR>for(; i<len; i ){ <BR>var oI = arr[i]; [i] = new String(oI && oI[prop] || ''))._obj = oI; <BR>} <BR>} <BR>else if(typeof prop=='function') { <BR> for(; i<len; i ){ <BR>var oI = arr[i]; <BR>(props[i] = new String(oI && prop(oI) || ''))._obj = oI; <BR>} <BR>} <BR>else { <BR>throw '間違ったパラメータの型'; <BR>} <BR>for(i=0; i<len; i ) { <BR>ret[i] = props[i]._obj; <BR>if(desc) ret.reverse(); <BR>for( var i=0;i<1000;i ){ <BR>document.write('<div>a' i '</div>') <br>} <br>var els=document.getElementsByTagName(' div'); <br>varcards=getRandomPlayCard(els.length); <br>var randomEls=[]; <br>for(var i=0,len=cards.length;i<len;i ) Cards[i]]=els[i];//シャッフルされたカードに従って要素配列をシャッフルします<BR>alert(['総数: ',randomEls.length,'順序をシャッフルした後: ',randomEls[0] . innerHTML,randomEls[randomEls.length-1].innerHTML]); <BR>var d0=new Date(); <BR>var elsSorted=sortBy(randomEls,function(el){return el.sourceIndex 100000000;}) <BR>alert(['合計数:',elsSorted.length,'ソートに時間がかかる:',new Date()-d0,'再ソート後:',elsSorted[0].innerHTML,elsSorted[elsSorted.length- 1] .innerHTML]); <BR></script>
配列のネイティブ ソートでは、内部で使用されるソート アルゴリズムにより複数の比較が必要になります。時間がかかるのは当然です。
上記のクイック ソートには複数の比較がありません。
ただし、
1. el 属性値を取り出し、その属性値を使用して String オブジェクト
2 を生成します。 String オブジェクトに el を追加します。
3. String オブジェクトを使用して配列を形成します。
4.ネイティブ ソートを使用して String オブジェクト配列をソートします。
5.ソートされた String 配列で、el を順番に削除します。
ソートされた el 配列が得られます。