Главная страница
    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.035 c
6-1103815645
VadimEagle
2004-12-23 18:27
2005.03.06
Скачать файл


1-1108907516
Olka
2005-02-20 16:51
2005.03.06
Знак табуляции


4-1106206229
DmiSb
2005-01-20 10:30
2005.03.06
Печать из IE


6-1104082322
Ertong
2004-12-26 20:32
2005.03.06
Изображение в WebBrowser


14-1108701985
Slider007
2005-02-18 07:46
2005.03.06
Выскажите пожалуйчта мнение по выбору марки винчестера





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский