後ろから走査していって、自分より前のどれかと交換していく訳ですね。
計算量は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();
}
}
Author:yamasv@gmail.com
コメント、トラックバック、リンクはお気軽に
-->
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| - | - | - | - | - | 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 | - | - | - | - | - | - |