第53回
今回は、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  戻る