1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Упорядочить отдельно каждое сечение трехмерного массива А [p, m, n] насквозь по колонкам по неубыванию.
сортировка(Показать/Скрыть)
function PCube_SelectExchange2_byTruthIndex(var Cube: PCube; const p, m, n: word): longint; var B: MyType; i, ks, js, jt, kt: word; StartTime, FinishTime: TTime; Begin with StartTime do GetTime(Hours,Minutes,Seconds,HSeconds); for i := 1 to p do for ks := 1 to n do for js := 1 to m do begin for jt := js+1 to m do if Cube^[i]^[jt]^[ks] <= Cube^[i]^[js]^[ks] then begin b := Cube^[i]^[jt]^[ks]; Cube^[i]^[jt]^[ks] := Cube^[i]^[js]^[ks]; Cube^[i]^[js]^[ks] := b; end; for kt := ks+1 to n do for jt :=1 to m do if Cube^[i]^[jt]^[kt] <= Cube^[i]^[js]^[ks] then begin b := Cube^[i]^[jt]^[kt]; Cube^[i]^[jt]^[kt] := Cube^[i]^[js]^[ks]; Cube^[i]^[js]^[ks] := b; end; end; with FinishTime do GetTime(Hours,Minutes,Seconds,HSeconds); PCube_SelectExchange2_byTruthIndex := ResTime(StartTime, FinishTime); end;
Сортировка выдает удивительные вещи для разных размеров массива, хотя по идее должна выдавать одинаковые(как-бы логично): Ведь если(допустим массив отсортирован) посчитать количество таких (первых)
Так... Давай для начал разберемся, что ты делаешь, и имеешь ли ты право вот так запросто сравнивать результаты. Чуть-чуть изменяем
function PCube_SelectExchange2_byTruthIndex(var Cube: PCube; const p, m, n: word): longint; var B: MyType; i, ks, js, jt, kt: word; StartTime, FinishTime: TTime; cnt : longint; // <--- 1 Begin cnt := 0; with StartTime do GetTime(Hours,Minutes,Seconds,HSeconds); for i := 1 to p do for ks := 1 to n do for js := 1 to m do begin for jt := js+1 to m do begin inc(cnt); // <--- 2 if Cube^[i]^[jt]^[ks] <= Cube^[i]^[js]^[ks] then begin b := Cube^[i]^[jt]^[ks]; Cube^[i]^[jt]^[ks] := Cube^[i]^[js]^[ks]; Cube^[i]^[js]^[ks] := b; end; end; for kt := ks+1 to n do begin inc(cnt); // <--- 3 for jt :=1 to m do if Cube^[i]^[jt]^[kt] <= Cube^[i]^[js]^[ks] then begin b := Cube^[i]^[jt]^[kt]; Cube^[i]^[jt]^[kt] := Cube^[i]^[js]^[ks]; Cube^[i]^[js]^[ks] := b; end; end; end; with FinishTime do GetTime(Hours,Minutes,Seconds,HSeconds); writeln ('count = ', cnt); // <--- 4 PCube_SelectExchange2_byTruthIndex := ResTime(StartTime, FinishTime); end;
, то есть, проверяем количество сравнений (от него же зависит общее время работы с матрицей). Что имеем? Правильно: у матриц (100*4*400) и (100*400*4) счетчик одинаков и = 32160000. А вот у матрицы (100*40*40) - 6240000, то бишь в 5 с лишним раз меньше. Откуда возникают вопросы. Первый из них - ты вообще тестировал свой алгоритм? Скажем, на матрицах 5*6*2 и 5*3*4? Визуально проверял, работает ли он? Сортируется одинаково? А то выполняешь вслепую какие-то действия, потом сравниваешь результаты, а их, возможно, вообще нельзя сравнивать...