Лічильник
Сьогодні Разом
Відвідувань 451 5307155
Авторізацій 66 426693
Користувачів 39 2656
Статья

90. Быстрая сортировка


Выше описанные алгоритмы сортировки обладают одним существенным недостатком: относительно низкой скоростью сортировки больших массивов.

Существенно уменьшить время сортировки можно применив алгоритм так называемой быстрой сортировки. Идея быстрой сортировки заключается в следующем: для выбранной части массива находим значение среднего элемента (опорный элемент). Ищем первый элемент в поиске слева на право, который больше или равен опорному и меняем его местами с первым элементом, в поиске с право налево, который меньше или равен опорному. Такой обмен продолжается до тех пор, пока левый индекс не превысит правый индекс элементов найденной пары. После чего для каждой из двух частей (от левой границы до правого индекса, и от левого индекса до правой границы) повторяем вышеописанные действия.

Рекурсивная реализация на C/C++
 void qsort(int* a, int left, int right) {
  int l = left, r = right;
  int m = a[(left + right) / 2]; // Значение опорного элемента
  do {
   while (a[l] < a[m])
    l++;
   while (a[r] > a[m])
    r--;
   if (l <= r) {
    int temp = a[l];
    a[l] = a[r];
    a[r] = temp;
    l++;
    r--;
   }
  } while (l < r);
  if (left < r)
   qsort(a, left, r);
  if (l < right)
   qsort(a, l, right);
 }
Предлагаемый алгоритм быстрой сортировки относится к так называемым неустойчивым типам сортировки, при котором элементы с одинаковыми значениями могут изменить свое положение в массиве относительно друг друга.