miscellaneous

[ActionScript 3.0] Fisher-Yatesアルゴリズムの可視化

要素をランダムに並べ替えるFisher-Yatesというアルゴリズムを可視化してみた。
下のウィンドウをマウスクリックすると並び替えの様子がアニメーションされます。

後ろから走査していって、自分より前のどれかと交換していく訳ですね。
計算量はO(n)です。

package{
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        import flash.utils.*;
        
        import caurina.transitions.Tweener;
        
        [SWF(width="400", height="200",backgroundColor="0xffffff")]
        
        
        public class FisherYates2 extends Sprite{
                
                private var balls:Array = [];
                private var processing:Boolean = false;
                
                private var Y:int = 100;
                private var INTERVAL:int = 10;
                
                private var RADIUS:int = 4;
                public function FisherYates2(){
                        
                        for(var i:int = 0 ; i < 40 ; i++){
                                
                                var c:int = ((i*5) << 16) + ((i*5) << 8);
                                var b:Ball = new Ball(c,RADIUS);
                                
                                balls.push(b);
                                addChild(b);
                                b.x = i*INTERVAL+RADIUS;
                                b.y = Y;
                        }
                        
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
                        
                }
                
                // シャッフルして並び替え手順を記録
                private function shuffle(i:int) : void{
                        
                        if(i > 0){
                                var j:int = Math.floor(Math.random() * (i + 1));
                                
                                
                                // 並び替えをアニメーション
                                var b:Ball = balls[i];
                                
                                Tweener.addTween(b, {x:j*INTERVAL+RADIUS, y:Y,
                                                         _bezier:[{x:i*INTERVAL+RADIUS, y:Y-20}, {x:j*INTERVAL+RADIUS, y:Y-20},],
                                                         time:1, transition:"linear"} );
                                
                                b = balls[j];
                                Tweener.addTween(b, {x:i*INTERVAL+RADIUS, y:Y,
                                                         _bezier:[{x:j*INTERVAL+RADIUS, y:Y+20}, {x:i*INTERVAL+RADIUS, y:Y+20},],
                                                         
                                        time:1, transition:"linear",
                                                         onComplete:function():void{shuffle(--i)}});
                                
                                
                                if(i != j){
                                        
                                        // 中身を並び替える
                                        
                                        var ball:Ball= balls[i];
                                        balls[i] = balls[j];
                                        balls[j] = ball;
                                        
                                }
                        }else
                        processing = false;
                        
                }
                
                private function mouseDown(e:Event):void{
                        
                        if(processing)
                        return;
                        processing = true;
                        
                        // シャッフル
                        shuffle(balls.length-1);
                }
        }
}

import flash.display.*;

internal class Ball extends Sprite{
        
        public function Ball(color:int, radius:int){
                
                graphics.beginFill(color);
                graphics.drawCircle(0,0,radius);
                graphics.endFill();
        }
}





  1. 2008/01/17(木) 20:46:38|
  2. ActionScript 3.0
  3. | トラックバック:1
  4. | コメント:0
<<[ActionScript 3.0] 最小二乗法 | ホーム | [ActionScript 3.0] transform.matrixの操作だけで画像を3D回転>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://yamasv.blog92.fc2.com/tb.php/116-3fc1fbc4
この記事にトラックバックする(FC2ブログユーザー)

シャッフルを目視する

11月10日のエントリ配列のシャッフル「Fisher-Yates」でFishe...
  1. 2008/01/18(金) 01:27:04 |
  2. AS2APP
Google

プロフィール

Author:yamasv@gmail.com
コメント、トラックバック、リンクはお気軽に

最近の記事

ブログ検索

カテゴリー

-->

カレンダー

07 | 2008/08 | 09
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

過去ログ

最近のコメント

最近のトラックバック

RSSフィード

リンク

このブログをリンクに追加する

全ての記事を表示する

全ての記事を表示する



あわせて読みたい