Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab5.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
78.85 Кб
Скачать

Сортировка методом Шелла

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

Исходный массив

F D A C B E

1

C B A F D E

2

A B C D E F

Пример 5. Сортировка методом Шелла.

void ShellSort(char *item,int count); // Прототип функции сортировки

//---------------------------------------------------------------------------

void __fastcall TForm1::bSortClick(TObject *Sender)

{

char *str=Edit1->Text.Trim().c_str();

int n=Edit1->Text.Length();

str[n]=’\0’;

ShellSort(str,(int)strlen(str)); // Вызов функции сортировки

Edit2->Text=AnsiString(str);

}

//---------------------------------------------------------------------------

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

void ShellSort(char *item,int count)

{

register int i,j,gap,k;

char x;

int a[5];

a[0]=9; a[1]=5; a[2]=3; a[3]=2; a[4]=1;

for(k=0;k<5;k++)

{

gap=a[k];

for(i=gap;i<count;i++)

{

x=item[i];

for(j=i-gap;x<item[j] && j>=0;j=j-gap)

{

item[j+gap]=item[j];

}

item[j+gap]=x;

}

}

}

Метод быстрой сортировки

По своим показателям превосходит все остальные рассмотренные алгоритмы и считается наилучшим универсальным алгоритмом на сегодняшний день. В его основе – метод перестановок.

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

  1. Случайным образом.

  2. Осреднением небольшого набора значений, принадлежащих разделу.

Для того, чтобы сортировка была оптимальной, следует выбирать значение, расположенное точно в середине диапазона значений.

Исходный массив

F E D A C B

1

B C A D E F

Этот процесс повторяется для каждого раздела. В приведенном примере в качестве компаранда выбирается серединный элемент каждого раздела.

Пример 6. Быстрая сортировка. В данном примере создаются две функции: Quick() и qs(). Функция Quick() задает вызов основной сортирующей функции qs().Функцию qs() можно вызывать и непосредственно с использованием трех аргументов.

void qs(char *item,int left,int right);

void Quick(char *item,int count); // Прототипы функций

//---------------------------------------------------------------------------

void __fastcall TForm1::bSortClick(TObject *Sender)

{

char *str=Edit1->Text.Trim().c_str();

int n=Edit1->Text.Length();

str[n]=’\0’;

Quick(str,(int)strlen(str));

Edit2->Text=AnsiString(str);

}

//---------------------------------------------------------------------------

void Quick(char *item,int count)

{

qs(item,0,count-1);

}

//-------------------------

void qs(char *item,int left,int right)

{

register int i,j;

char x,y;

i=left; j=right;

x=item[(left+right)/2];

do

{

while(item[i]<x && i<right) i++;

while(x<item[j] && j>left) j--;

if(i<=j)

{

y=item[i];

item[i]=item[j];

item[j]=y;

i++; j--;

}

} while(i<=j);

if(left<j) qs(item,left,j);

if(i<right) qs(item,i,right);

}

Задания

  1. Написать параметризованную функцию пузырьковой сортировки. Вызвать ее для трех различных типов данных.

  1. Написать параметризованную функцию сортировки методом отбора. Вызвать ее для трех различных типов данных.

  1. Написать параметризованную функцию сортировки методом вставки. Вызвать ее для трех различных типов данных.

  1. Написать параметризованную функцию сортировки методом Шелла. Вызвать ее для трех различных типов данных.

5. Написать параметризованную функцию быстрой сортировки. Вызвать ее для трех различных типов данных.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]