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

Узнай цену своей работы

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

Листинг программы
  1. type
  2. Arr = array [1..1000] of integer;
  3. procedure QuickSort(var a: Arr; Lo,Hi: integer);
  4.  
  5. procedure Sort(l,r: integer);
  6. var x,i,j: integer;
  7. begin
  8. i:=l; j:=r; x:=a[random(r-l+1)+l];
  9. Repeat
  10. while x>a[i] do inc(i);
  11. while x<a[j] do dec(j);
  12. if i<=j then
  13. begin
  14. a[i]:=a[i] xor a[j]; //при обмене с помощью дополнительной переменной алгоритм работает корректно.
  15. a[j]:=a[j] xor a[i];
  16. a[i]:=a[i] xor a[j];
  17. inc(i); dec(j);
  18. end;
  19. until i>=j;
  20. if l<j then sort(l,j);
  21. if i<r then sort(i,r);
  22. end;
  23.  
  24. begin
  25. randomize;
  26. Sort(Lo,Hi);
  27. end;
  28. var
  29. a: Arr;
  30. Lo,Hi,i: integer;
  31. begin
  32. read(Hi);
  33. for i:=1 to Hi do read(a[i]);
  34. Lo:=1;
  35. QuickSort(a,Lo,Hi);
  36. for i:=1 to 5 do write(a[i],' ');
  37. end.

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

textual
Листинг программы
  1. type
  2.   Arr = array [1..1000] of integer;
  3.  
  4. procedure QuickSort(var a: Arr; Lo, Hi: integer);
  5.  
  6.  
  7.   procedure Sort(l, r: integer);
  8.   var
  9.     x, i, j: integer;
  10.   begin
  11.     i := l;j := r;x := a[random(r - l + 1) + l];
  12.     repeat
  13.       while x > a[i] do inc(i);
  14.       while x < a[j] do dec(j);
  15.       if (i <= j) then    
  16.       begin
  17.         if (a[i] <> a[j]) then
  18.         begin
  19.           a[i] := a[i] xor a[j]; //при обмене с помощью дополнительной переменной алгоритм работает корректно.
  20.           a[j] := a[j] xor a[i];  
  21.           a[i] := a[i] xor a[j];
  22.         end;
  23.         inc(i);dec(j);
  24.       end;
  25.     until i >= j;
  26.     if l < j then sort(l, j);
  27.     if i < r then sort(i, r);
  28.   end;
  29.  
  30.  
  31. begin
  32.   randomize;
  33.   Sort(Lo, Hi);
  34. end;
  35.  
  36. var
  37.   a: Arr;
  38.   Lo, Hi, i: integer;
  39.  
  40. begin
  41.   read(Hi);
  42.   for i := 1 to Hi do read(a[i]);
  43.   Lo := 1;
  44.   QuickSort(a, Lo, Hi);
  45.   for i := 1 to 5 do write(a[i], ' ');
  46. end.

Объяснение кода листинга программы

В данном коде реализован алгоритм быстрой сортировки (QuickSort).

  1. Объявлены следующие переменные:
    • Arr - массив типа array [1..1000] of integer, в котором будет происходить сортировка;
    • a - ссылка на массив Arr;
    • Lo, Hi, i - целочисленные переменные, используемые в качестве границ для сортировки;
    • Sort - процедура, в которой реализуется рекурсивный вызов быстрой сортировки;
    • x, j, i - целочисленные переменные, используемые в процедуре Sort для обмена элементов массива.
  2. В процедуре Sort реализуется рекурсивный вызов быстрой сортировки. Процедура начинается с выбора опорного элемента x из массива a.
  3. Затем происходит рекурсивный вызов процедуры Sort для левой и правой половин массива, если длина этих половин больше 1.
  4. Если элементы a[i] и a[j] равны, то они меняются местами с помощью операции XOR (xor). Эта операция возвращает истинное значение, если хотя бы один из её аргументов истинен, и ложное значение в противном случае.
  5. Если длина левой или правой половин массива равна 1, то процедура заканчивается.
  6. В основной части программы происходит инициализация массива a, задание границ сортировки (Lo, Hi), вызов процедуры Sort и вывод отсортированного фрагмента массива. Ошибка в коде заключается в неправильном использовании операции XOR для обмена элементов массива. В данном случае, если элементы a[i] и a[j] равны, то они будут обменены на себя же (т.е. не произойдет обмен). Вместо операции XOR следует использовать операцию присваивания (:=).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы