Не работает 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)»
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.
Объяснение кода листинга программы
В данном коде реализован алгоритм быстрой сортировки (QuickSort).
- Объявлены следующие переменные:
- Arr - массив типа array [1..1000] of integer, в котором будет происходить сортировка;
- a - ссылка на массив Arr;
- Lo, Hi, i - целочисленные переменные, используемые в качестве границ для сортировки;
- Sort - процедура, в которой реализуется рекурсивный вызов быстрой сортировки;
- x, j, i - целочисленные переменные, используемые в процедуре Sort для обмена элементов массива.
- В процедуре Sort реализуется рекурсивный вызов быстрой сортировки. Процедура начинается с выбора опорного элемента x из массива a.
- Затем происходит рекурсивный вызов процедуры Sort для левой и правой половин массива, если длина этих половин больше 1.
- Если элементы a[i] и a[j] равны, то они меняются местами с помощью операции XOR (xor). Эта операция возвращает истинное значение, если хотя бы один из её аргументов истинен, и ложное значение в противном случае.
- Если длина левой или правой половин массива равна 1, то процедура заканчивается.
- В основной части программы происходит инициализация массива a, задание границ сортировки (Lo, Hi), вызов процедуры Sort и вывод отсортированного фрагмента массива. Ошибка в коде заключается в неправильном использовании операции XOR для обмена элементов массива. В данном случае, если элементы a[i] и a[j] равны, то они будут обменены на себя же (т.е. не произойдет обмен). Вместо операции XOR следует использовать операцию присваивания (:=).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д