Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.051 c
1-1109072071
Генри
2005-02-22 14:34
2005.03.06
Как узнать размер каталога?


3-1107422213
Term
2005-02-03 12:16
2005.03.06
Безопасность MS SQL


8-1100680884
BRemB
2004-11-17 11:41
2005.03.06
Формат файла TIF


14-1108542503
Nikola62
2005-02-16 11:28
2005.03.06
О "Кладовке"


3-1107498329
Ost
2005-02-04 09:25
2005.03.06
DBLookupComboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский