Цитата:
|
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;
}
}
}