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

Быстрая сортировка, хоть и была разработана более 40 лет назад, является наиболее широко применяемым и одним их самых эффективных алгоритмов сортировки. Метод основан на принципе «разделяй-и-властвуй».

Общая схема быстрой сортировки такова: из массива выбирается некоторый опорный элемент a[i], запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] – вправо (рис. 5.5). Теперь массив состоит из двух подмножеств, причем левое подмножество меньше, либо равно правого:

Рис. 5.5. Разделение массива на два подмассива

Для каждого подмассива будем иметь: если в подмассиве более двух элементов, рекурсивно запускается для него та же процедура. В конце получится полностью отсортированная последовательность.

Рассмотрим алгоритм быстрой сортировки подробнее.

1. На входе задаем массив a[0]... a[N] и опорный элемент p, по которому будет производиться разделение.

2. Введем два указателя: i и j (рис. 5.6). В начале алгоритма они указывают, соответственно, на левый и правый концы последовательности.

3. Будем двигать указатель i с шагом в 1 элемент по направлению к концу массива, пока не будет найден элемент a[i] >= p.

4. Аналогичным образом начнем двигать указатель j от конца массива к началу, пока не будет найден a[j] <= p.

5. Если i <= j, меняем a[i] и a[j] местами и продолжаем двигать i, j по тем же правилам.

6. Повторяем шаг 3, пока i <= j.

Рассмотрим работу процедуры быстрой сортировки для массива a[0]...a[6] и опорного элемента p = a[3] (рис. 5.6).

Рис. 5.6. Иллюстрация алгоритма быстрой сортировки

Теперь массив разделен на две части: все элементы левой меньше либо равны p, все элементы правой – больше, либо равны p. Разделение завершено.

Листинг 5.4. Задать исходный массив х[N]. Количество элементов массива N и значения элементов массива ввести с клавиатуры. Применяя алгоритм быстрой сортировки, отсортировать исходный массив в порядке возрастания его элементов. Вывести на экран дисплея исходный и отсортированный массивы.

//L5_4.cpp

#include <iostream>

using namespace std;

void qs(int* s_arr, int first, int last); // Прототип функции qs()

int main()

{

setlocale(LC_CTYPE,"russian");

int i, n, *x;

do

{

cout<<"Введите число элементов массива ";

cin>>n;

}while (n<=1);

x=new int[n];

for(i=0; i<n; i++)

{

cout<<"Введите x("<<i+1<<")=";

cin>>x[i];

}

cout<<"Исходный массив\n";

for(i=0; i<n; i++)

cout<<x[i]<<" ";

cout<<endl;

qs(x,0,n-1);

cout<<"Полученный массив\n";

for(i=0;i<n;i++)

cout<<x[i]<<" ";

cout<<endl;

return 0;

}

void qs(int* s_arr, int first, int last)

{

int i = first, j = last, x = s_arr[(first + last) / 2];

do {

while (s_arr[i] < x) i++;

while (s_arr[j] > x) j--;

if(i <= j) {

if (i < j) swap(s_arr[i], s_arr[j]);

i++;

j--;

}

} while (i <= j);

if (i < last)

qs(s_arr, i, last);

if (first < j)

qs(s_arr, first, j);

}

На рис. 5.7 приведен результат выполнения программы листинга 5.4.

Рис. 5.7. Результат работы программы листинга 5.4


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: