Быстрая сортировка Хоара - C (СИ)

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

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

Здрасьте. Вот писал быструю сортировку Хоара на Си, вроде все сделал, а на практике она часто не полностью сортирует массив, особенно с большой длиной. Никак не могу понять, почему. То есть она его сортирует, но некоторые числа стоят не на своем месте.
Листинг программы
  1. void hSort(int *A, int N) //N - длина массива A
  2. {
  3. int tmp;
  4. if (N <= 1)
  5. return;
  6. int l = 0, r = N - 1; //l - левая граница, r - правая
  7. int pivot = A[rand()%N];
  8. while (l != r)
  9. {
  10. if (A[l] >= pivot)
  11. {
  12. if (A[r] < pivot)
  13. {
  14. tmp = A[l];
  15. A[l] = A[r];
  16. A[r] = tmp;
  17. l++;
  18. }
  19. if (l != r) r--;
  20. }
  21. else l++;
  22. }
  23. if (A[0] == A[N-1]) return; //проверка на то, что мы сортируем не одинаковые элементы, чтоб не зацикл.
  24. hSort(A, l);
  25. hSort(A + l, N-l);
  26. }

Решение задачи: «Быстрая сортировка Хоара»

textual
Листинг программы
  1. void sort(int*arr,int l,int r)
  2. {
  3.     int i=l, j=r;
  4.     int d;
  5.     int m=arr[(l+r)/2];
  6.     while(i<=j)
  7.     {
  8.         for(; arr[i]<m; i++);
  9.         for(; arr[j]>m; j--);
  10.         if(i<=j)
  11.         {
  12.             d=arr[i];
  13.             arr[i++]=arr[j];
  14.             arr[j--]=d;
  15.         }
  16.     }
  17.     if(l<j) sort(arr,l,j);
  18.     if(i<r) sort(arr,i,r);
  19.  
  20. }
  21. ..................
  22. sort(arr,0,N-1);

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

  1. В функции sort(int*arr,int l,int r) происходит сортировка массива arr от индекса l до индекса r.
  2. Переменные i и j инициализируются значениями l и r соответственно.
  3. Переменная d инициализируется нулевым значением.
  4. Переменная m инициализируется значением arr[(l+r)/2]. Это средний элемент массива, который используется в качестве опорного элемента при сортировке.
  5. Цикл while(i<=j) повторяется до тех пор, пока i не станет больше j.
  6. Внутренний цикл for(; arr[i]<m; i++) перемещает i-й элемент, меньший чем опорный элемент, влево от i.
  7. Внутренний цикл for(; arr[j]>m; j--) перемещает j-й элемент, больший чем опорный элемент, вправо от j.
  8. Если внутренний цикл завершается, значит, элементы arr[i] и arr[j] уже находятся в правильном порядке. Их меняют местами и продолжают сортировку.
  9. Если элементы arr[i] и arr[j] находятся в неправильном порядке, их меняют местами, i увеличивают на 1, j уменьшают на 1 и продолжают сортировку.
  10. Если i становится больше j, это означает, что массив уже отсортирован, и функция может быть вызвана рекурсивно для сортировки других частей массива.
  11. Если j становится меньше i, это означает, что элементы arr[i] и arr[j] находятся в неправильном порядке, и функция должна быть вызвана рекурсивно для сортировки подмассива, начиная с индекса i и заканчивая индексом j.
  12. Переменная N инициализируется значением размера массива arr.
  13. Функция вызывается с параметрами arr, 0 и N-1, что означает сортировку всего массива arr.
  14. В результате выполнения функции массив arr будет отсортирован в порядке возрастания.

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


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

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

14   голосов , оценка 4 из 5

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

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

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