マージソート(笑)

by 12346 forked from バブルソート(笑) (diff: 34)
4回笑ってみたらマージソートになりましたw
(シリーズ化しても需要無いとか言わないで!)

バブルソートほど単純じゃないから関数多くなっちゃったなー

ほんとは
var stack:Array=[];
じゃなくてバーチャルマシンのスタックをこっそり操作(http://wonderfl.net/c/kNtG)してどこで再帰してるのかわからないコードにしたかったけど断念。
♥0 | Line 32 | Modified 2012-02-18 13:38:38 | MIT License
play

ActionScript3 source code

/**
 * Copyright 12346 ( http://wonderfl.net/user/12346 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/w6Z1
 */

package{import flash.display.*;
public class MergeSort extends Sprite{
    public function MergeSort(){
        addChild(T).width=T.height=465;
        
        A=[5,6,1,7,4,8,3,2,9];
        b=A.length;
        
        print(A);
        print("\n---sort start---");
        
        while()()()();
        
        print("---sort end---\n");
        print(A);
    }
}}

var A:Array,B:Array=[],a:int,b:int,c:int=0,d:int,f:Function,g:Function,:Function=G;

function F():Function{return a<b?f:g}
function G():Function{f=H;g=I;=F;a=1;return J;}
function H():void{d=b>>1;push3(K,c,b);push3(G,c+d,b-d);b=d;}
function I():void{b=pop();c=pop();=pop();}
function J():void{}
function K():Function{print(A+" -> Merge "+c+" to "+(c+b-1));g=M;=F;a=0;d=b;b>>=1;return f=L;}
function L():void{B[a]=A[c+b-++a];}
function M():void{f=N;g=O;b=d;}
function N():void{B[a]=A[c+a++];}
function O():void{f=P;g=I;a=0;}
function P():void{A[c+--d]=B[B[a]<B[b-1]?--b:a++];}

import flash.text.*;
var T:TextField=new TextField;
function print(s:*):void{T.appendText(String(s)+"\n");}

var stack:Array=[],p:int=3;
function pop():*{return stack[--p];}
function push(_:*):void{stack[p++]=_;}
function push3(x:*,y:*,z:*):void{push(x);push(y);push(z);}