Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

сортировка   Найти похожие ветки 

 
новый   (2004-01-24 21:16) [0]

Мастера, помогите пожалуйста, почему у меня не работает процедура сортировки. Где может быть ошибка?
procedure Sortsalary(var pp:Table);
var x : Employ;
i, j, n: integer;
begin
n:= length(pp);
for i:=0 to n-1 do
for j:=0 to n-2 do
if pp[j].plat > pp[j+1].plat then
begin
x:=pp[j+1];
pp[j+1]:=pp[j];
pp[j]:=x;
end;
end;


 
Stilgar ©   (2004-01-24 21:38) [1]

А можно узнать, что такое Table и Employ? Прошу прощения, наверное у меня склероз.


 
CyberFreak ©   (2004-01-24 21:54) [2]

Надо думать, Table - это массив элементов типа Employ. И этот массив надо отсортировать по полю plat. Было бы неплохо, если бы ты показал, как эти типы у тебя описаны.


 
CyberFreak ©   (2004-01-24 21:57) [3]

Да, и еще неплохо было знать, что значит "не работает". Вообще вроде как похоже на правду, меня тока смущает строка:

n:= length(pp);


 
alexx   (2004-01-24 21:59) [4]

Описание типов:
type
ss = String [20];
Employ = record
fam: ss;
im: ss;
ot: ss;
plat: real;
end;
Table = array of Employ;


 
новый   (2004-01-24 21:59) [5]

Описание типов:
type
ss = String [20];
Employ = record
fam: ss;
im: ss;
ot: ss;
plat: real;
end;
Table = array of Employ;


 
новый   (2004-01-24 22:03) [6]

Программа запускается, но при вызове функции выдает ошибку: нарушение доступа по адресу ...


 
jack128 ©   (2004-01-24 22:05) [7]

Процедурка должна сортировать. Хотя её можно и оптимизировать..


 
jack128 ©   (2004-01-24 22:06) [8]

Ах ну да.

for i:=0 to n-2 do
for j:=0 to n - 2 - i do


 
новый   (2004-01-24 22:22) [9]

Все равно выдает ошибку.


 
Stilgar ©   (2004-01-24 22:27) [10]

Чтобы было быстрее, внешний цикл сортировки пузырьком должен быть while или repeat с флагом, который устанавливается, когра не одна пара элементов не была перемещена. Но почему не работает, я не понимаю.
Пришел в голову очевидный вариант: до вызова процедуры SetLength делаете? Больше чем на один елемент массива?


 
BorH ©   (2004-01-24 22:36) [11]

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
ss = String [20];
Employ = record
fam: ss;
im: ss;
ot: ss;
plat: real;
end;
Table = array of Employ;

procedure Sortsalary(var pp:Table);
var
x : Employ;
i, j, n: integer;
begin
n:= length(pp);

for i:=0 to n-1 do
for j:=0 to n-2 do
if pp[j].plat > pp[j+1].plat then
begin
x:=pp[j+1];
pp[j+1]:=pp[j];
pp[j]:=x;
end;
end;

var
i:integer;
PP:Table;

begin
randomize;

SetLength(PP,10);

for i:=0 to Length(PP)-1 do
begin
PP[i].plat:=random(100);
Write(PP[i].plat:4:0);
end;
Writeln;

Sortsalary(PP);

Writeln("Sorted!");

for i:=0 to Length(PP)-1 do
begin
Write(PP[i].plat:4:0);
end;

Readln;
end.


Всё пашет...
У тебя что-то или с машиной, или с системой или... :)) Будем надеятся, что с первыми двумя :))


 
TUser ©   (2004-01-25 08:12) [12]

Вообще-то Stilgar прав - алгоритм, мягко говоря, не оптимальный. Даже если оставаться в пределах квадратичного алгоритма - так лучше его поразумнее организовать. Типа на каждом шаге упорядочены первые N элементов. Берем N+1-й, ищем куда бы его поставить. Если требуется смещаем элементы - побыстрее будет. Ну, а если length(Table) - это много, тогда пузырьками и прочее.



Страницы: 1 вся ветка

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
3-16078
BorisUK
2004-01-12 09:46
2004.02.06
порты по которым работает DCOM


1-16444
nv
2004-01-27 09:40
2004.02.06
А можно ли из DLLки (типа плагина) получить переменне основной пр


1-16259
Kinderrr
2004-01-24 10:46
2004.02.06
variants


6-16545
Simon
2003-12-02 20:16
2004.02.06
Как перехватить сетевой трафик?


14-16703
Piter
2004-01-18 01:33
2004.02.06
CreateToolhelp32Snapshot возвращает неверный дескриптор