Показать сообщение отдельно
Старый 23.04.2014, 20:44
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 18  
Ответить с цитированием
Akopalipsis
Banned

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Akopalipsis, меня вы уже традиционно не слушаете, так хоть людей послушайте.
Вы не представляете, на сколько я дружелюбный человек и только по этому я повторюсь - у меня нет поводов Вас не слушать!! Хоть Вы меня и банили и почти в каждом сообщении говорите, что я после года обучения глупее Вас, который, как я понял из соседней ветки, в два раза старше меня... Нет! Это не в моей глупости дело и не в моём желании быстрее все узнать, это в Вас дело. Это Вы думаете, что все должно быть как у Вас. Так что я Вас внимательно слушаю и не пропускаю слов мимо. Бывает правда, что я не понимаю ответа и настаиваю. Вот как в этом случае - Вы несколько раз закрывали тему о коллекциях, в которых я хотел получить ответы на ВСЕ вопросы касающихся этой темы. я так и не понял, используют их или нет и по этому так и стал ковыряться в них дальше. И читал о всех алгоритмах на вики и на кодовики и на хабре и сидел и две с половиной недели экспериментировал. И вот пришло время, когда я попробовал и понял все из найденного и самое то, было бы выбрать лучшее. И вот я здесь.

И вот какой момент, все говорят, что этот код фигня, но предположим, мне нужно отсортировать объекты по свойствам. Как это сделать? sortOn делает это за 7500 секунд для 100000 объектов, а этот код за 600 с компаратором и 300 без. Тогда поделитесь пожалуйста, как Вы делаете сортировку свойств быстрее чем за 300 милисекунд?

Добавлено через 23 минуты
Жутко извиняюсь извиняюсь, провел тест не свойство..
Почти 1700 с компаратором и 1400 без. Но все равно не 7500.

Добавлено через 24 минуты
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.TimerEvent;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.utils.getTimer;
	import flash.utils.Timer;
 
	public class SpeedTest extends Sprite 
	{
		private const N:int = 10000000;
		private const D:int = 5000;
		private const C:int = 100;
 
		private var delay:int = 2;
		private var repeat:int = 5;
		private var runtime:Number;
		private static var _textField:TextField;
		private var _temer:Timer;
 
		public function SpeedTest() 
		{
			_textField = new TextField();
			_textField.autoSize = TextFieldAutoSize.LEFT;
			super.addChild(_textField);
			_temer = new Timer(delay, repeat);
			_temer.addEventListener(TimerEvent.TIMER, temer_timerHandler);
			_temer.start();
		}
 
		private function temer_timerHandler(event:TimerEvent):void 
		{
			this.speed();
			_textField.appendText("Прошло время - " + runtime + "\n");
		}
		public  var a:* = random();
		public var b:* = random()
		private function speed():void
		{
			var i:int;
			var t:Number;
 
			var array:Array = [];
			var sprite:Sprite
 
			for (var j:int = 0; j < 100000; j++) 
			{
				sprite = new Sprite();
				sprite.x = roundRandom();
				array[j] = sprite;
			}
 
			for (i = 0, t = getTimer(); i < 1; i++)
			{
				defaultSort(array, this.comparator);
				//array.sortOn('x', Array.NUMERIC);
			}
			runtime = getTimer();
			runtime -= t;
		}
		private function defaultSort(array:Array, companator:Function):void
		{
			var length:int = array.length;
 
			var result:Array = array;
			var buffer:Array = new Array(length);
			var temp:Array;
 
			var bufferPointer:uint;
			var leftPointer:int;
			var rightPointer:int;
 
			var sectionSize:int = 1;
 
			var leftSectionStart:uint;
			var leftSectionFinish:uint;
 
			var rightSectionStart:uint;
			var rightSectionFinish:uint;
 
			while (sectionSize < length)
			{
				bufferPointer = 0;
				leftSectionStart = 0;
 
				while (leftSectionStart < length)
				{
					rightSectionStart = leftSectionStart + sectionSize;
					rightSectionFinish = rightSectionStart + sectionSize;
 
					if (length < rightSectionFinish)
					{
						rightSectionFinish = length;
 
						if (length < rightSectionStart)
								rightSectionStart = length;
					}
 
					leftSectionFinish = rightSectionStart;
 
					leftPointer = leftSectionStart;
					rightPointer = rightSectionStart;
 
					while (leftPointer - leftSectionFinish & rightPointer - rightSectionFinish)
					{
						if (companator(array[leftPointer], array[rightPointer]) == -1)
								buffer[bufferPointer++] = array[leftPointer++];
						else
								buffer[bufferPointer++] = array[rightPointer++];
					}
 
					while (leftPointer < leftSectionFinish)
							buffer[bufferPointer++] = array[leftPointer++];
 
					while (rightPointer < rightSectionFinish)
							buffer[bufferPointer++] = array[rightPointer++];
 
					leftSectionStart += sectionSize << 1;
				}
 
				temp = array;
				array = buffer;
				buffer = temp;
 
				sectionSize <<= 1;
			}
 
			if (result !== array)
			{
				var i:int;
				while (i < length)
						result[i] = array[i++];
			}
		}
		private function comparator(a:Sprite, b:Sprite):int
		{
			if (a.x < b.x) return -1;
			if (a.x > b.x) return 1;
			return 0;
		}
		private function roundRandom():int
		{
			return Math.random() * 10;
		}
		private static function random():Number
		{
			return Math.random() * 10;
		}
 
	}
 
}