| 今回は、Array.sort()に渡す関数についてやります。 避けては通れない道のはずですから。 |
| Array.sort()に渡す関数の基礎知識 |
基本的なものfunction(a,b){
return b-a;
}
これだと大きい順にソートされます。b-aをa-bにすると小さい順になります。この関数によって返される値が 負の数ならばa,b 0ならばa,b 1ならばb,a の順に入れ替わる、といった考え方のようです(今回の実験で少し違うことがわかります)。 |
| 以下実験(引数はinputに入力してください) |
function Main1(n){
var a=(f=function(i,r){return i<n?f(i+1,r.push([i])):r},f(0,[]));
var s='';
a.sort(function(p,q){
s+='('+p+','+q+')\n';
return 0;
});
alert(s);
} |
function Main2(){
var a=new Array(1,2,3,4,5,6,7,8,9);
var i=0,s='';
a.sort(function(p,q){
if(i)
s+=i+'回後:\t'+a+'\n';
i++;
return q-p;
});
alert(s);
alert(a);
} |
function Main3(){
var a=new Array(1,2,3,4,5,6,7,8,9);
var i=0,s='';
a.sort(function(p,q){
s+=(q-p)+'\n';
return q-p;
});
alert(s);
alert(a);
} |
function Main4(n){
var a=(f=function(i,r,n){return i<n?f(i+1,(r.push([i]),r),n):r},f(0,[],n));
var t=(f=function(i,r,n){return i<(n*(n-1)/2)?f(i+1,(r.push(Math.floor(Math.random()*3)-1),r),n):r},f(0,[],n));
var i=-1
var s=''
var b=new Array().concat(a);
a.sort(function(p,q){
i++;
s+='('+p+','+q+'),';
return t[i];
});
alert(b+'\n'+s+'\n'+t+'\n'+a);
} |
| Main1とMain4において、aの初期値は0以上n未満のn個の整数を並べた配列です。 Main4において、tは-1,0,1のどれかをランダムにnC2(nコンビネーション2)個並べた配列です。 Main1は、どういう順番でソートが行われるのか(並べ替えのない場合)という実験で、 Main2は、sort()に渡された関数内で、ソート中のaの様子はどうかという実験で、 Main3は、sort()に渡された関数が返す値はどうなっているのかという実験で、 Main4は、これまでの結果を踏まえたうえで、sort()はどのように行われているのかを実験しています。 Main4の実験結果によって頭がいかれたので、これで実験は終了です。 どういう並べ方してるんでしょうか。 |
| top 戻る |