Не работает swap элементов через xor в рекурсии. Почему? (Procedure QuickSort) - PascalABC.NET

Формулировка задачи:

type
  Arr = array [1..1000] of integer;
  
procedure QuickSort(var a: Arr; Lo,Hi: integer);
 
 
 procedure Sort(l,r: integer);
 var x,i,j: integer;
  begin
    i:=l; j:=r; x:=a[random(r-l+1)+l];
    Repeat
     while x>a[i] do inc(i);
     while x<a[j] do dec(j);
     if i<=j then 
       begin
         a[i]:=a[i] xor a[j]; //при обмене с помощью дополнительной переменной алгоритм работает корректно.
         a[j]:=a[j] xor a[i];  
         a[i]:=a[i] xor a[j];
         inc(i); dec(j); 
       end; 
    until i>=j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end;
     
 
begin
 randomize;
 Sort(Lo,Hi);
end;
 
var 
  a: Arr;
  Lo,Hi,i: integer;
begin
 read(Hi);
 for i:=1 to Hi do read(a[i]);
 Lo:=1;
 QuickSort(a,Lo,Hi);
 for i:=1 to 5 do write(a[i],' ');
end.

Код к задаче: «Не работает swap элементов через xor в рекурсии. Почему? (Procedure QuickSort) - PascalABC.NET»

textual
type
  Arr = array [1..1000] of integer;
 
procedure QuickSort(var a: Arr; Lo, Hi: integer);
  
  
  procedure Sort(l, r: integer);
  var
    x, i, j: integer;
  begin
    i := l;j := r;x := a[random(r - l + 1) + l];
    repeat
      while x > a[i] do inc(i);
      while x < a[j] do dec(j);
      if (i <= j) then    
      begin
        if (a[i] <> a[j]) then
        begin
          a[i] := a[i] xor a[j]; //при обмене с помощью дополнительной переменной алгоритм работает корректно.
          a[j] := a[j] xor a[i];  
          a[i] := a[i] xor a[j];
        end;
        inc(i);dec(j); 
      end; 
    until i >= j;
    if l < j then sort(l, j);
    if i < r then sort(i, r);
  end;
 
 
begin
  randomize;
  Sort(Lo, Hi);
end;
 
var
  a: Arr;
  Lo, Hi, i: integer;
 
begin
  read(Hi);
  for i := 1 to Hi do read(a[i]);
  Lo := 1;
  QuickSort(a, Lo, Hi);
  for i := 1 to 5 do write(a[i], ' ');
end.

13   голосов, оценка 3.692 из 5


СОХРАНИТЬ ССЫЛКУ