Главная страница

Сортировка Шелла. Сортировка Шелла


Скачать 29 Kb.
НазваниеСортировка Шелла
Дата01.06.2019
Размер29 Kb.
Формат файлаdoc
Имя файлаСортировка Шелла.doc
ТипДокументы
#79885

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

Сортировка по методу Шелла также относится к обменным сортировкам, и даже принцип функционирования очень похож на "метод пузырька".

В этом методе первоначально рассматриваются элементы отстоящие друг от друга на расстояние d=[n/2], где [ ] - операция взятия целой части, и n - количество элементов исходного массива.

На следующих шагах d меняется по закону d=[d/2], при d=1 метод Шелла вырождается в метод стандартного обмена ("Метод Пузырка")

Давайте рассмотрим пример:

Дано множество

{6,3,4,8,2,9}

d=[n/2]=[6/2]=3
{6,3,4,8,2,9} - сравниваем 6 и 8

{6,2,4,8,3,9} - сравниваем 3 и 2, переставляем

{6,3,4,8,2,9} - сравниваем 4 и 9
далее d=[d/2]=[3/2]=1

выродился в метод "Пузырька"

В этом примере не очень видна эффективность этого метода, но представьте, что вы сортируете 1000 элементов. Этот метод обеспечивает более быстрое перебрасывание больших элементов вправо и меньших влево, чем метод "Пузырька" и этим обеспечивает большее быстродействие.

#include

#include
int BubbleSort(int *array,int len)

{

/* Код сортировки из предыдущего шага */

};
int ShellSort(int *array,int len)

{

long d=len,i,j;

int c;
do

{

d=d/2;

i=0;

while ((j=i+d)
{

if (array[i]>array[j])

{

c=array[i];

array[i]=array[j];

array[j]=c;

};

i++;

};

}

while (d>1);
BubbleSort(array,len);

};
int main()

{

int k[10]={8,-5,1,7,3,-10,6,5,10,9};

printf("\n\n\n");

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

printf(" %d ",k[i]);

printf("\n");
ShellSort(k,10);
for (i=0; i<10;i++)

printf(" %d ",k[i]);

printf("\n");
return 0;

};

Результат выполнения:

8 -5 1 7 3 -10 6 5 10 9

-10 -5 1 3 5 6 7 8 9 10

Для теста эффективности я создал счетчик циклов, и до вырождения в метод "Пузырька" было выполнено всего 3 прохода. Причем, что больше всего меня удивило, массив был вот в каком состоянии:

-10 -5 1 3 5 6 7 8 9 10

А тут видно, что он уже отсортирован и метод "Пузырька" работал в холостую, но совершил всего один цикл, т.к. в нем выполнилось условие Айверсона.

По-моему очевидно, что метод Шелла обладает большим быстродействием.


написать администратору сайта