livedoor Blog��䤬���Ѥ��ĤŤ��Ƥ�����ͳ�ΤҤȤĤ���JavaScript������դ��뤳�ȡ�

�������Ǥ��ʤ��entries��ί�ޤ�ޤ���������������ˤǼ¹��ѤΥ�������ɽ���ѤΥ��������Ѱդ���Τ��Ͱ��ܤ��ä����˴������ޤ�������ʤ櫓�ǡ��ɤ������������ä�ȯ���Ǥ��뤫��ޤȤ�Ƥߤޤ�����

0. DOM��ID��դ餺�˥ǥ��

����ʴ����Υǥ⤬���ä��Ȥ��ޤ��礦����404 Blog Not Found:javascript - Array#sort������quicksort����٤�!?�פˤ����Τ��ľ������ΤǤ���

# of Items:

�褯����Τϡ�input������pre������ID��դäơ�document.getElementById('foobar')�ǥ�����������Ȥ�����Ρ�Prototype.js��jQuery��ȤäƤ����$('foobar')��û���Ϥʤ�ޤ�����HTML������μ�֤ϸ���ޤ���

���������Τ褦�˽񤯤��Ȥǡ�ID�����פˤʤ�ޤ���

# of Items:
<input type="text" value="10000" size="8" maxlength="8"
><input type="submit" value="start" onclick="run_demo(this)"
><pre></pre>

�ǡ�run_demo����ȤǤ������ʲ��Τ褦�ˤʤäƤ��ޤ���

run_demo = function(that){
    var val = that.previousSibling.value;
    var pre = that.nextSibling;
    pre.innerHTML = '';
    var seed = random_array(val);
    (function(o){
        for (var k in o) (function(l, f){
            window.setTimeout(function(){
                pre.innerHTML += l + ':\t' + timeit(f, seed) + 'ms' + '<br>';
            }, 0)
        })(k, o[k]);
    })({
        builtin:builtinsort,
        quick_iter:quicksort_i,
        quick_recur:quicksort_r
    });
};

souce_code_above.replace(/that/g,'this')����С����Τޤޥܥ����onclick����ˤ֤��ޤ����ޤ��������ǤϺǸ��tip�Τ���ˡ������ƴؿ��ˤ��Ƴ��������Ƥ��ޤ���

1. PRE��������Ȥ򥯥�å��Ǽ¹Ԥ���

����ʴ����Τ�ΤǤ���

alert('Hello, JavaScript');

����ϡ��ʲ��ΤȤ���˼¸�����ޤ���

<pre>
alert('Hello, JavaScript');
</pre><input type="submit" value="Run" onclick="
    try{
        var e = this.previousSibling;
        eval( e.innerText || e.textContent );     
    }catch(e){
        alert(e);
    }
">

pre������input�����δ֤˷�֤��ʤ��Τϡ�tip#0��Ʊ�ͤ���ͳ�Ǥ���

pre�ǤϤʤ���textarea��input�ʤ顢����˥���ץ�ˤʤ�ޤ���

����ʶ��ˡ�

<textarea>
alert('Hello, JavaScript');
</textarea><input type="submit" value="Run" onclick="
    try{
        eval( this.previousSibling.value );     
    }catch(e){
        alert(e);
    }
">

3.PRE��������Ȥ򡢥����ɻ���ɾ������

�����Ĥϼ¤Ϻ��ޤǤⰦ�Ѥ��Ƥ����ΤǤ������⤦��Ĥ�tip�򸫤Ĥ����Τǡ�

����˰ܤ����ˡ��ޤ��Ͼ�Υǥ�ǻȤ�줿�ؿ��������ʤɤ�

timeit = function(){
    var elapsed = (new Date).getTime();
    var args = Array.apply(null, arguments);
    args.shift().apply(null, args);
    elapsed =  (new Date).getTime() - elapsed;
    return elapsed;
}

���ƤΤȤ��ꡢ�¹Ի��֤��¬���ޤ���timeit(func, arg)�Ȥ������˻Ȥ��ޤ��� args.shift().apply(null, args)���빽�������äƤޤ���

random_array = function(n){
    var ret = [0];
    while(--n) ret[n] = n; // sorted array
    for (n = ret.length-1; n; --n) { // Fisher-Yates Suffle
        var m = Math.floor(Math.random() * (n + 1));
        if (n == m) continue;
        var tmp = ret[n]; ret[n] = ret[m]; ret[m] = tmp;
    }
    return ret;
};

n�Ĥ����Ǥ����ä���������������ޤ���

middle = function(h, t){ 
    return h + ((t - h) >>> 1)
};
cmp_number = function(a, b){
    return a - b;
}

�����Ȥμ����Ǥ褯�Ѥ�����ؿ��Ǥ���

builtinsort = function(ary, cmp){
    return ary.slice().sort(cmp || cmp_number);
};

builtin��Array.prototype.sort()�����˲�Ū�˼¹Ԥ��ޤ���ary.slice()�Ǹ�������Υ��ԡ����äƤ��ޤ���

quicksort_r = function(ary, cmp){
    var ret = ary.slice();
    if (! cmp ) cmp = cmp_number;
    return (function (head, tail) {
        var pivot = ret[middle(head, tail)];
        var i = head - 1;
        var j = tail + 1;
        while (1){
            while (cmp(ret[++i], pivot) < 0);
            while (cmp(ret[--j], pivot) > 0);
            if (i >= j) break;
            var tmp = ret[i]; ret[i] = ret[j]; ret[j] = tmp;
        }
        if (head < i - 1) arguments.callee(head, i - 1);
        if (j + 1 < tail) arguments.callee(j + 1, tail);
        return ret;
    })(0, ary.length - 1);
}

quicksort�μ����Ǥ������������㡼�Τ������ǡ��Ƶ��ƤӽФ���ɬ�פʰ����ο�����ĤǺѤ�Ǥ��ޤ��������arguments.callee�Τ������ǡ����κƵ��ƤӽФ�����̵̾�Ǥ���

quicksort_i = function(ary, cmp){
    var ret = ary.slice();
    if (! cmp ) cmp = cmp_number;
    var stack = [ 0, ary.length - 1 ];
    while(stack.length){
        var tail = stack.pop();
        var head = stack.pop();
        var pivot = ret[middle(head, tail)];
        var i = head - 1;
        var j = tail + 1;
        while (1){
            while (cmp(ret[++i], pivot) < 0);
            while (cmp(ret[--j], pivot) > 0);
            if (i >= j) break;
            var tmp = ret[i]; ret[i] = ret[j]; ret[j] = tmp;
        }
        if (head < i - 1) { stack.push(head); stack.push(i - 1); }
        if (j + 1 < tail) { stack.push(j + 1); stack.push(tail); }
    }
    return ret;
}

���������Ƶ��ǡ��Ƶ��ؿ���ɤ���ä�����Ƶ�������Τ���狼��䤹���񤤤Ƥߤޤ�����

�ǡ���äȤ������餬���ꡣ�¤ϡ������ޤǤ�script�����ϰ����о줷�Ƥ��ޤ��󡣳ƴؿ��������pre��������ˤΤ�¸�ߤ��ޤ��������������Ƥ�pre������script�����ˤϤ������ʤ��Τǡ�class="evalonload"�ȤʤäƤ����ΤΤߤ�ɾ�����뤳�Ȥˤ��ޤ���

���η�̤����ʲ��Ǥ���

(function(root, className){
     var walkDOM = function(node, f){
        f(node);
        var kids = node.childNodes;
        for (var i = 0, l = kids.length; i < l; i++) arguments.callee(kids[i], f)
    };
    walkDOM(root, function(node){
        if (node.nodeType  !== 1) return;
        if (node.nodeName.toLowerCase() !== 'pre') return;
        if (node.className !== className) return;
        node.className = 'prettyprint'; // for google-code-prettify
        try{
            eval(node.innerText || node.textContent);
        }catch(e){
            alert(e + "\n" + (node.innerText || node.textContent));
        }
    });
})(document.body, 'evalonload');

�¤˥���ץ�ʤ�ΤǤ���walkDOM��̵̾���Ǥ����㤤�ޤ������褯�Ȥ���ǽ�ʤΤǡ���������ȴ���Ф���褦�ˤ��Ƥ���ޤ�������������script�����Ȥ��Ƶ����κǸ�˥��ԥڤ���С����Ȥ����̤˥�������Ž�դ��ƹԤ������ǡָ����Ƥ���ư���ץڡ���������夬��Ȥ����櫓�Ǥ���

�ʤ��������tips�� Firefox3, IE7, Safari3, Opera9, Chrome1 �ǥƥ��Ȥ��Ƥ���ޤ���

Enjoy!

Dan the Lazy JavaScripter