Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, swame, Вы писали:
S>>1. Твой алгоритм не сортирует. S>>Поставь после сортировки S>>for w := 0 to 999998 do S>> Assert (curarray.fitems[w]<=curarray.fitems[w+1], S>> w.ToString + ' ' + FloatToStr(curarray.fitems[w]) + ' ' + FloatToStr(curarray.fitems[w+1]));
K>А что это? У вас конец массива 999998 а надо 99998, по размеру массива.
я увеличивал у себя размер массива, можешь у себя поставить свое число.
K>Если выставить 99998 — срабатывания не будет.
Должны срабатывать, проверь что ассерты в проекте включены.
Срабатывает Assert а не Range Check
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAssertionFailed with message '1 5,53084537386894E-5 2,90726311504841E-5 (C:\M_Src\test\Khimik\Unit1.pas, line 230)'.
---------------------------
Break Continue Copy Help
---------------------------
K>p.s. Влад спрашивает, забанить ли меня, просьба всем неравнодушным заглянуть в тему и поставить либо минус либо плюс:
Здравствуйте, swame, Вы писали: S>Должны срабатывать, проверь что ассерты в проекте включены. S>Срабатывает Assert а не Range Check
У меня не срабатывает (заменил ассерты на if-ы):
Скрытый текст
procedure TForm1.Button1Click(Sender: TObject);
var
q,w:integer;
firsttime:longword;
timegpt,timesections:longword;
curarray:tdoublearray;
outstr:string;
begin
firsttime:=GetTickCount;
for q:=0 to 100 do begin
curarray:=tdoublearray.Create;
curarray.Capacity:=100000;
for w:=0 to 99999 do curarray.Add(random);
curarray.QSort2GPT;
for w := 0 to 99998 do if not (curarray.fitems[w]<=curarray.fitems[w+1]) then application.MessageBox(pchar('qsort2gpt'+w.ToString + ' ' + FloatToStr(curarray.fitems[w]) + ' ' + FloatToStr(curarray.fitems[w+1])),'App',MB_OK);
curarray.Free;
end;
timegpt:=gettickcount-firsttime;
firsttime:=GetTickCount;
for q:=0 to 100 do begin
curarray:=tdoublearray.Create;
curarray.Capacity:=100000;
for w:=0 to 99999 do curarray.Add(random);
curarray.QSort10Sections;
for w := 0 to 99998 do if not (curarray.fitems[w]<=curarray.fitems[w+1]) then application.MessageBox(pchar('qsort10sec '+w.ToString + ' ' + FloatToStr(curarray.fitems[w]) + ' ' + FloatToStr(curarray.fitems[w+1])),'App',MB_OK);
curarray.Free;
end;
timesections:=gettickcount-firsttime;
outstr:='GPT: '+inttostr(timegpt)+'; Секции: '+inttostr(timesections);
application.MessageBox(pchar(outstr),'Тест',mb_ok);
end;
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, swame, Вы писали:
K>>А что это? У вас конец массива 999998 а надо 99998, по размеру массива.
S>я увеличивал у себя размер массива, можешь у себя поставить свое число.
K>>Если выставить 99998 — срабатывания не будет.
S>Должны срабатывать, проверь что ассерты в проекте включены. S>Срабатывает Assert а не Range Check
S>--------------------------- S>Debugger Exception Notification S>--------------------------- S>Project Project1.exe raised exception class EAssertionFailed with message '1 5,53084537386894E-5 2,90726311504841E-5 (C:\M_Src\test\Khimik\Unit1.pas, line 230)'. S>--------------------------- S>Break Continue Copy Help S>---------------------------
Вы отредактировали ваше сообщение как ответ на моё последнее? Я думаю скорее всего у вас range check не срабатывает и цикл выходит за границы массива, вы не проверили границы цикла. Вставьте пожалуйста мой код из последнего моего сообщения, К меня ни ассерты ни ифы не срабатывают. Плюс я у меня есть дополнительный код в button2click где тоже всё проверяется.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, swame, Вы писали:
K>Вы отредактировали ваше сообщение как ответ на моё последнее? Я думаю скорее всего у вас range check не срабатывает и цикл выходит за границы массива, вы не проверили границы цикла. Вставьте пожалуйста мой код из последнего моего сообщения, К меня ни ассерты ни ифы не срабатывают. Плюс я у меня есть дополнительный код в button2click где тоже всё проверяется.
Извиняюсь, то что не сортирует это я сломал неаккуратными изменениями. Сортирует.
Пункт про то что требуется в 8 раз больше памяти, чем надо, остается. 15% скорости в большинстве случаев того не стоят.
S>Извиняюсь, то что не сортирует это я сломал неаккуратными изменениями. Сортирует. S>Пункт про то что требуется в 8 раз больше памяти, чем надо, остается. 15% скорости в большинстве случаев того не стоят.
Наверно если бы размер массива был в 1000 раз больше, разница была бы весьма заметной. Да, мой алгоритм требует больше памяти, так и должно быть в теории. У производительности сортировки есть теоретический предел, если не путаю у быстрой сортировки время пропорционально N*ln(N), у моей сортировки может даже N, хотя не уверен. Мне с моим проектом время от времени приходилось решать задачи на оптимизацию.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, swame, Вы писали:
S>>Извиняюсь, то что не сортирует это я сломал неаккуратными изменениями. Сортирует. S>>Пункт про то что требуется в 8 раз больше памяти, чем надо, остается. 15% скорости в большинстве случаев того не стоят.
K>Наверно если бы размер массива был в 1000 раз больше, разница была бы весьма заметной. Да, мой алгоритм требует больше памяти, так и должно быть в теории. У производительности сортировки есть теоретический предел, если не путаю у быстрой сортировки время пропорционально N*ln(N), у моей сортировки может даже N, хотя не уверен. Мне с моим проектом время от времени приходилось решать задачи на оптимизацию.
С массивом в 1000 раз больше у тебя бы давно уже закончилась память.
Если нужно сортировать не вещественные, а например целые то есть более эффективная сортировка radix https://habr.com/ru/articles/335920/
если нужна скорость то уже можно было бы распараллелить на ядрах. НО это уже довольно кропотливая работа. В лоб не получится.