Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2013, 07:53   #1
AndrzejX
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 55
По умолчанию Разобраться с указателями. Сортировка массива записей.

Прошу помочь разобраться с сортировкой массива записей, используя указатели. Сама сортировка реализована, отсюда и вопрос.

С целью сравнения эффективности (по времени) сортировки указателями по сравнению с сортировкой непосредственно массива написал две простые процедуры сортировки. Первая сортирует массив указателей, вторая сам исходный массив. Алгоритм один и тот же (сортировка выбором):

Код:
type TRec = Record
     A, B, C, D, E, F, G, H: String[255];
     N: Integer;
end;

type TPRec = ^TRec;

var
  Form1: TForm1;
  ARec: Array[1..40000] of TRec;
  PRec: Array[1..40000] of TPRec;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i, n: Integer;
begin
Randomize;
n:=High(ARec);
for i:=1 to n do
 begin
  ARec[i].N:=random(n);
  PRec[i]:=@ARec[i];
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i, j, n: Integer;
 temp: TPRec;
 min, jmin: Integer;
 T: TTime;
begin
T:=Now;
n:=High(ARec);
for i:=1 to n do
  begin
    jmin:=i;
    min:=PRec[i]^.N;
    for j:=i+1 to n do
      if PRec[j]^.N<min then
       begin
        jmin:=j;
        min:=PRec[j]^.N;
       end;
    if i<>jmin then
      begin
        temp:=PRec[i]; PRec[i]:=PRec[jmin]; PRec[jmin]:=temp;
      end;
  end;
Caption:=TimeToStr(Now-T);
end;

procedure TForm1.Button2Click(Sender: TObject);
var i, j, n: Integer;
 temp: TRec;
 min, jmin: Integer;
 T: TTime;
begin
T:=Now;
n:=High(ARec);
for i:=1 to n do
  begin
    jmin:=i;
    min:=ARec[i].N;
    for j:=i+1 to n do
      if ARec[j].N<min then
       begin
        jmin:=j;
        min:=ARec[j].N;
       end;
    if i<>jmin then
      begin
        temp:=ARec[i]; ARec[i]:=ARec[jmin]; ARec[jmin]:=temp;
      end;
  end;
Caption:=TimeToStr(Now-T);
end;
Ожидал, что запись большого размера должна копироваться дольше, чем 4 байта указателя, и сортировка указателями должна по-любому работать быстрее. Программа же показывает, что это не так. Прошу помочь понять, почему.

Единственное предположение, что присваивание записей сама Delphi производит с помощью указателей...

Вопрос, конечно, дилетантсткий, но таков я и есть.

Последний раз редактировалось AndrzejX; 01.03.2013 в 07:55.
AndrzejX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка c вычисляемыми адресами, вычерпыванием, по индексам и с указателями rita-zaya123 Паскаль, Turbo Pascal, PascalABC.NET 5 19.04.2012 18:22
Не могу разобраться с указателями FRATER1234 Общие вопросы C/C++ 7 13.10.2011 11:23
Не получается разобраться в программе с указателями sunny_alice Паскаль, Turbo Pascal, PascalABC.NET 15 16.04.2011 22:26
Сортировка массива записей Юляшко Паскаль, Turbo Pascal, PascalABC.NET 5 28.04.2010 13:57
Товарищи, помогите разобраться с указателями scibern Общие вопросы C/C++ 7 11.01.2009 12:28