|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Неправильный Qsort
==Delphi7
Если я использую классику сортировки, то все сортируется правильно, даже если я использую массив ссылок на массив входа байтов, которые надо сортировать. То есть, если в текущем коде вот это, то сортируется правильно while a [i] < x do i:=i+1; while x < a [j] do j:=j-1; Но если я меняю на простую функцию while CmpByte (a [i], x) do i:=i+1; while CmpByte (x, a [j]) do j:=j-1; то все меняется, массив сортируется не полностью, есть мусор на выходе. Испробовал все, давал адреса в функцию, смещения и прочее, все неправильно, даже если сделать вот так, то неправильно сортирует Function CmpByte (a, b: byte): boolean; begin Result:= a < b; end; Не могу понять где косяк, в дебаге адреса передаются правильно. Проверьте код .................................................. ............................ procedure Qsort (l,r: longint); // Работает нормально, ошибок нет var i,j,x,y: longint; begin i:=l; j:=r; x:=a [(l+r) shr 1]; repeat while a[i] < x do i:=i+1; while x < a[j] do j:=j-1; if i<=j then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; i:=i+1; j:=j-1; end; until i>j; if l<j then qsort( l,j); if i<r then qsort( i,r); end; //////////////////////////////////////////////////////////////////////////////// function CmpByte (a, b: byte): boolean; // Не работает begin Result := false; if a < b then Result := true; // или так = if a < b then Result := true else Result := false; //Не работает end; //////////////////////////////////////////////////////////////////////////////// procedure Qsort2 (l,r: byte); // Не работает var i,j,x,y: longint; begin i:=l; j:=r; x:=a [(l+r) shr 1]; repeat while CmpByte (a [i], x) do i:=i+1; while CmpByte (x, a[j]) do j:=j-1; if i<=j then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; i:=i+1; j:=j-1; end; until i>j; if l<j then qsort2( l,j); if i<r then qsort2( i,r); end; ============================ Проблема решена. Меня попросили выложить минимальный код, я все лишнее почистил и вдруг процедура стала работать правильно. У меня было подозрение на ошибку компилятора, именно это и подтвердилось, я создал новый проект и перенес код туда, все работает правильно. Последний раз редактировалось West2000, 10.12.2020 в 15:56. |