[betweenAS3]BubbleSort And SelectionSort

by applicott
クリックするたびに動きます。
上手く可視化出来なかった。。。
シャッフル > BubbleSort > Shuffle > SelectionSort >>>....
♥0 | Line 131 | Modified 2010-04-14 22:48:06 | MIT License
play

ActionScript3 source code

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

package
{
	/*
	 * 
	クリックするたびに動きます。
	上手く可視化出来なかった。。。
	シャッフル > BubbleSort > Shuffle > SelectionSort >>>....
	
	
	*/
	
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.filters.GlowFilter;
	import flash.ui.Keyboard;
	import flash.utils.Timer;
	import flash.utils.setInterval;
	
	import frocessing.color.ColorHSV;
	
	import org.libspark.betweenas3.BetweenAS3;
	import org.libspark.betweenas3.core.tweens.groups.SerialTween;
	import org.libspark.betweenas3.easing.Bounce;
	import org.libspark.betweenas3.easing.Cubic;
	import org.libspark.betweenas3.tweens.IObjectTween;
	import org.libspark.betweenas3.tweens.ITween;
	
	[SWF( backgroundColor="0x000000", frameRate="40")]
	public class Main extends Sprite
	{
		private var n:int=0;
		private const NUM:uint = 30; // 配列の個数
		private var slist:Vector.<Sprite> = new Vector.<Sprite>(NUM, true);
		private var kankaku:int=20; // Barの間隔
		private var delay:Number=0; // アニメーションのdelay
		private var nagasa:Number=3; // barの長さ
		private var ss:Sprite = new Sprite;
		private var ss2:Sprite = new Sprite;
		public function Main()
		{

			stage.quality = StageQuality.HIGH;
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;
	//ゴミ		
//			//赤い線
//			ss.graphics.beginFill(0xff0000);
//			ss.graphics.drawRect(0,0,1,NUM*3*nagasa);
//			ss.graphics.endFill();
//			ss.y=150;
//			addChild(ss);
//			//青い線
//			ss2.graphics.beginFill(0x0000ff);
//			ss2.graphics.drawRect(0,0,1,NUM*4*nagasa);
//			ss2.graphics.endFill();
//			ss2.y=150;
//			addChild(ss2);
			for(var i:int =0; i< NUM;i++){
				var hsv:ColorHSV = new ColorHSV((i*8.5),1,1);
				//var mat:ColorMaterial = new ColorMaterial(hsv.toRGB().value);
				var sp:Sprite = new Sprite();// (mat,5,5*i+0.1);
				var angle:Number = (i / 100) * 360 * Math.PI / 180;
				sp.graphics.beginFill(hsv.toRGB().value);
				sp.graphics.drawRect(0,0,1,(i+1)*nagasa);
				sp.graphics.endFill();
				sp.x=i*kankaku;
				sp.y=300;
				slist[i]=sp;
				addChild(slist[i]);
			}
			

			
			stage.addEventListener(MouseEvent.CLICK,click);			
		}
		
		
		
		//セットインターバル
		private function click(e:MouseEvent):void{
			
			switch(	n++%4){
				case 0: shuffle();
					break;
			//	case 1: qsort(cList,0,cList.length-1);
				//	break;
				case 1: bsort();
					break;
				case 2: shuffle();
					break;
				case 3: ssort();
					break;
			}
		}
		//シャッフル
		private function shuffle():void{
			var i:int=slist.length;
			while (--i) {
				var j:int = Math.floor(Math.random() * (i + 1));
				if (i == j) continue;
				var k:Sprite = slist[i];
				slist[i] = slist[j];
				slist[j] = k;
				slist[i].x=i*kankaku;
				anime(i,j);
			}
		}
		
		//選択ソート
		private function ssort():void{
			var min:int=0;
			var k:Sprite;
			for(var i:int=0;i<slist.length;i++){
				min=i;
				for(var j:int=i+1;j<=slist.length-1;j++){
					if(slist[min].height>slist[j].height) min=j;
				}
				k = slist[i];
				slist[i] = slist[min];
				slist[min] = k;
				anime(i);
			}
		}
		

		//バブル
		private function bsort():void{
			var delay:Number=0.0;	
			for(var i:int=0;i<slist.length-1;i++){
				for(var j:int=slist.length-1;j>i;j--){
					if(slist[j-1].height>slist[j].height){
						var k:Sprite = slist[j];
						trace(k.x, slist[j].x);
						slist[j] = slist[j-1];
						slist[j-1] = k;
						anime(j,j-1);
					}
				}
			}
		}	
		
		// swap アニメーション
		private function anime(i:int,j:int=-1):void{	
			var d:Number=0.1;
			
			//i 
			var t0:ITween = BetweenAS3.serial(BetweenAS3.delay(BetweenAS3.tween(slist[i], {y:250}, null,d,Cubic.easeInOut),delay),
				BetweenAS3.delay(BetweenAS3.tween(slist[i], {x:i*kankaku}, null, d,Cubic.easeInOut),delay),
				BetweenAS3.delay(BetweenAS3.tween(slist[i], {y:300}, null, d,Cubic.easeInOut),delay));
			if(j!=-1) {
			//j
			var t1:ITween = BetweenAS3.serial(BetweenAS3.delay(BetweenAS3.tween(slist[j], {y:250}, null, d,Cubic.easeInOut),delay),
				BetweenAS3.delay(BetweenAS3.tween(slist[j], {x:j*kankaku}, null, d,Cubic.easeInOut),delay),
				BetweenAS3.delay(BetweenAS3.tween(slist[j], {y:300}, null, d,Cubic.easeInOut),delay));
			}
			//ただの再描画//			slist[i].x=i*kankaku; //			if(j!=-1)slist[j].x=j*kankaku;
			
			// 引数ひとつの場合 t0だけ実行するため 処理重くなるなこれ
			if(j==-1) t1 = t0;
			var t2:ITween=BetweenAS3.parallel(t0,t1	);
			t2.onComplete = onComplete;
			t2.onCompleteParams = [t2];
			
			t2.play();
			// 1つのアニメーションのdelay 増やすとゆっくり動く selectionSortはdelay遅くてもいいけど、 bubbleはアニメーションが多くなるからはやめに。
			delay+=0.02;
			
		} 
		
		//ゴミ
		private function animeRed(sp:Sprite,i:int):void{
			var t0:ITween = BetweenAS3.delay(BetweenAS3.tween(sp, {x:i*kankaku}, null, 6,Cubic.easeInOut),delay);
			
			t0.onComplete = onComplete;
			t0.onCompleteParams = [t0];
			t0.play();
		}
		
		
		//同期とるため アニメーション終了処理
		private function onComplete(t:ITween):void
		{
			t.stop();
		}

		
	}
}

Forked