Последнее обновление:
| Главная |  Алгоритмы |  Назад | 
Быстрая сортировка

Теория

        Автор этого алгоритма, видимо, настолько был поражён скоростью его работы, что помимо простого и нескромного названия "быстрая сортировка" ничего не подобрал. Тем не менее, спустя более 40 лет, этот алгоритм до сих пор остаётся наиболее широко применяемым и одним из самых эффективных алгоритмов, что оправдывает его название.

        Метод основан на подходе "разделяй-и-властвуй" и состоит из следующих шагов:

  1. Из массива выбирается некоторый опорный элемент a[i];
  2. Запускается процедура разделения массива, которая перемещает все элементы, меньшие, либо равные a[i], влево от него, а все элементы, большие, либо равные a[i] - вправо;
  3. Теперь массив состоит из двух подмножеств, причем левое меньше, либо равно правого;
  4. Далее, для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру (шаг 2).

Общий алгоритм

quick_sort( массив a, верхняя граница N )
{
    Выбрать опорный элемент p - середину массива
    Разделить массив по этому элементу
    Если подмассив слева от p содержит более одного элемента,
        вызвать quick_sort для него.
    Если подмассив справа от p содержит более одного элемента,
        вызвать quick_sort для него.
}

Реализация для указателя

        template void quick_sort(T* array, long StartN, long EndN) { // На входе - массив a[], N - его последний элемент. register long i = StartN; register long j = EndN; T p = a[(i-j)>>1]; // центральный элемент T temp; // процедура разделения do { while(a[i] < p) ++i; while(a[j] > p) --j; if(i<=j) { temp = a[i]; a[i] = a[j]; a[j] = temp; ++i; --j; } } while(i<=j); // рекурсивные вызовы, если есть, что сортировать if (j>StartN) quick_sort(a, StartN, j); if (i

| Главная |  Алгоритмы |  Назад | 
Hosted by uCoz