Не работает 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»
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
СОХРАНИТЬ ССЫЛКУ