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

Вниз

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

 
TUser ©   (2005-02-19 15:20) [0]

Посмотрите, plz, почему этот код не работает. Пузырьками сортирует правильно, а QuickSort дает ошибку. После долгого отлаживания я перерисовал код из Борландовского Classes.pas, но он все равно не пашет. Может быть кто-нибудь увидит ошибку, которую не вижу я.
Спасибо.

begin
   {
   for i:=0 to length(S)-1 do
     for m:=length(S)-1 downto i+1 do
       if CompareGroups(S[m].Pos1, S[m].Pos2, S[m].Chain1, S[m].Chain2,
                        S[m-1].Pos1, S[m-1].Pos2, S[m-1].Chain1, S[m-1].Chain2) < 0 then
         Swap(m,m-1);

         }

   repeat
     i:=L; j:=R;
     m:=(L + R) shr 1;
     repeat
        while CompareGroups(S[i].Pos1, S[i].Pos2, S[i].Chain1, S[i].Chain2,
                            S[m].Pos1, S[m].Pos2, S[m].Chain1, S[m].Chain2) < 0 do
           inc (i);
        while CompareGroups(S[j].Pos1, S[j].Pos2, S[j].Chain1, S[j].Chain2,
                            S[m].Pos1, S[m].Pos2, S[m].Chain1, S[m].Chain2) > 0 do
           dec (j);
        if i <= j then begin
           Swap(i,j);
           inc (i); dec(j);
           end;
     until i > j;
     if L < j then
        Sort(S,L,j);
     L:=i;
   until i >= R;
end;


 
MBo ©   (2005-02-19 15:31) [1]

Опиши, что нужно сортировать.


 
TUser ©   (2005-02-19 15:53) [2]

Массив из вот таких записей

  TScores = array of
   record
     Chain1, Chain2: TChain;
     Pos1, Pos2: integer;
     Value: single;
   end;


Ну, и есть функция, по которой они сравниваются
function CompareGroups(Pos11, Pos21: integer;
                      Chain11, Chain21: TChain;
                      Pos12, Pos22: integer;
                      Chain12, Chain22: TChain): shortint;

procedure C(I1, I2: integer);
begin
  if I1 < I2 then
    result:=-1
    else
  if I1 > I2 then
    result:=1
    else
    result:=0;
end;

begin
 C(Pos11, Pos12);
 if result = 0 then
   C(Pos21, Pos22);
 if result = 0 then
   C(integer(Chain11), integer(Chain12));
 if result = 0 then
   C(integer(Chain21), integer(Chain22));
end;


 
TUser ©   (2005-02-19 16:05) [3]

Кстати, если упихать все это дело в TList - то все нормально сортируется. Там используется QuickSort, причем код я уже оттуда срисовал один в один. Вот и хотелось бы понять, - почему кодгда код пищут программисты Борланда, он работает, а когда точно такой же код пишу я, - получается ерунда какая-то? :)


 
MBo ©   (2005-02-19 16:12) [4]

функцию сравнения для читабельности сделай такой:
function CompareGroups(ScoreRec1,ScoreRec2: TScoreRec): shortint;

procedure QuickSortRecs(var A: array of TScoreRec);

 procedure QuickSort(var A: array of TScoreRec; iLo, iHi: Integer);
 var
   Lo, Hi : Integer;
   Mid:TScoreRec;
 begin
   Lo := iLo;
   Hi := iHi;
   Mid := A[(Lo + Hi) div 2];
   repeat
     while CompareGroups(A[Lo], Mid) < 0 do Inc(Lo);
     while CompareGroups(A[Hi], Mid) > 0  do Dec(Hi);
     if Lo <= Hi then
       SwapRecs(A[Lo], A[Hi]);
   until Lo > Hi;
   if Hi > iLo then QuickSort(A, iLo, Hi);
   if Lo < iHi then QuickSort(A, Lo, iHi);
 end;

begin
 QuickSort(A, Low(A), High(A));
end;


 
begin...end ©   (2005-02-19 16:20) [5]

И не забываем про функцию CompareValue из модуля Math.



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

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

Наверх




Память: 0.48 MB
Время: 0.063 c
11-1092249616
=Sniper=
2004-08-11 22:40
2005.03.06
Как выделить цветом какое-либо свово в RichEdit е?


1-1108562583
Manfred8
2005-02-16 17:03
2005.03.06
Шахматка и как ее сотворить?


1-1108982614
lehich
2005-02-21 13:43
2005.03.06
ListBox


14-1108390297
III
2005-02-14 17:11
2005.03.06
Работа PHP


4-1106073014
onyx
2005-01-18 21:30
2005.03.06
Диалоговые окна на чистом API