Рекурсивная сортировка частей массива

Если в какой-то из получившихся в результате разбиения массива частей находиться больше одного элемента, то следует произвести рекурсивное упорядочивание этой части, то есть выполнить над ней операцию разбиения, описанную выше. Для проверки условия «количество элементов > 1», нужно действовать примерно по следующей схеме:

Имеется массив Mas[L..R], где L и R – индексы крайних элементов этого массива. По окончанию разбиения, указатели first и last оказались примерно в середине последовательности, тем самым образуя два отрезка: левый от L до last и правый от first до R. Выполнить рекурсивное упорядочивание левой части нужно в том случае, если выполняется условие L<last. Для правой части условие аналогично: first<R.

 

 

Код программы на C++:

 

#include <ctime>

const int n=7;

int first, last;

void quicksort(int *mas, int first, int last) //функция сортировки

{

int mid, count;

int f=first, l=last;

mid=mas[(f+l) / 2]; //вычисление опорного элемента

do

{

while (mas[f]<mid) f++;

while (mas[l]>mid) l--;

if (f<=l) //перестановка элементов

{

count=mas[f];

mas[f]=mas[l];

mas[l]=count;

f++;

l--;

}

} while (f<l);

if (first<l) quicksort(mas, first, l);

if (f<last) quicksort(mas, f, last);

}

 

void main() //главная функция

{

int *A=new int[n];

srand(time(NULL));

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

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

{

A[i]=rand()%10;

cout<<A[i]<<" ";

}

first=0; last=n-1;

quicksort(A, first, last);

cout<<endl<<"Результирующий массив: ";

for (int i=0; i<n; i++) cout<<A[i]<<" ";

delete []A;

}

 

Код программы на Pascal:

 

const n=7;

var A: array[1..n] of integer;

first, last, i: integer;

procedure quicksort(var mas: array[1..n] of integer; first, last: integer); {процедура сортировки}

var f, l, mid, count: integer;

begin

f:=first;

l:=last;

mid:=mas[(f+l) div 2]; {вычисление опорного элемента}

repeat

while mas[f]<mid do inc(f);

while mas[l]>mid do dec(l);

if f<=l then {перестановка элементов}

begin

count:=mas[f];

mas[f]:=mas[l];

mas[l]:=count;

inc(f);

dec(l);

end;

until f>l;

if first<l then quicksort(A, first, l);

if f<last then quicksort(A, f, last);

end;

 

begin {основной блок программы}

randomize;

write('Исходный массив: ');

for i:=1 to n do

begin

A[i]:=random(10);

write(A[i]:2);

end;

first:=1; last:=n;

quicksort(A, first, last);

writeln; write('Результирующий массив: ');

for i:=1 to n do write(A[i]:2);

end.

 

Стоит отметить, что быстрая сортировка может оказаться малоэффективной на массивах, состоящих из небольшого числа элементов, поэтому при работе с ними разумнее отказаться от данного метода. В целом алгоритм неустойчив, а также использование рекурсии в неверно составленном коде может привести к переполнению стека. Но, несмотря на эти и некоторые другие минусы, быстрая сортировка все же является одним из самых эффективных и часто используемых методов.