X-PDF

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

Поделиться статьей

В 1959 году американский ученый Дональд Шелл опубликовал алгоритм сортировки, который впоследствии получил его имя – «Сортировка Шелла». Этот алгоритм может рассматриваться и как обобщение пузырьковой сортировки, так и сортировки вставками.

Идея метода заключается в сравнение разделенных на группы элементов последовательности, находящихся друг от друга на некотором расстоянии. Изначально это расстояние равно d или n /2, где n — общее число элементов. На первом шаге каждая группа включает в себя два элемента расположенных друг от друга на расстоянии n /2 . они сравниваются между собой, и, в случае необходимости, меняются местами. На последующих шагах также происходят проверка и обмен, но расстояние d сокращается на d /2, и количество групп, соответственно, уменьшается. Постепенно расстояние между элементами уменьшается, и на d =1 проход по массиву происходит в последний раз.

Далее, на примере последовательности целых чисел, показан процесс сортировки массива методом Шелла (рис. 6.4). Для удобства и наглядности, элементы одной группы выделены одинаковым цветом.

Рисунок 6.4 – Пример сортировки Шелла

Первое значение, соответствующее расстоянию d равно 10/2=5. На каждом шаге оно уменьшается вдвое. Элементы, входящие в одну группу, сравниваются и если значение какого-либо элемента, стоящего левее того с которым он сравнивается, оказывается больше (сортировка по возрастанию), тогда они меняются местами. Так, элементы путем внутригрупповых перестановок постепенно становятся на свои позиции, и на последнем шаге (d =1) сортировка сводится к проходу по одной группе, включающей в себя все n элементов массива. При этом число требуемых обменов оказывается совсем небольшим.

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

int i, j, n, d, count .

void Shell(int A[], int n) //сортировка Шелла

{

d=n .

d=d/2 .

while (d&gt .0)

{

for (i=0 . i&lt .n-d . i++)

{

j=i .

while (j&gt .=0 &amp .&amp . A[j]&gt .A[j+d])

{

count=A[j] .

A[j]=A[j+d] .

A[j+d]=count .

j— .

}

}

d=d/2 .

}

for (i=0 . i&lt .n . i++) cout&lt .&lt .A[i]&lt .&lt . . //вывод массива

}

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

{

cout&lt .&lt .Размер массива &gt . . cin&gt .&gt .n .

int *A= new int[n] . //объявление динамического массива

for (i=0 . i&lt .n . i++) //ввод массива

{

cout&lt .&lt .i+1&lt .&lt . элемент &gt . .

cin&gt .&gt .A[i] .

}

cout&lt .&lt .nРезультирующий массив: .

Shell(A, n) .

delete [] A . //освобождение памяти

Представленная информация была полезной?
ДА
61.19%
НЕТ
38.81%
Проголосовало: 1510

}

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

type massiv=array[1..100] of integer .

var i, j, n, d, count: integer .

A: massiv .

procedure Shell(A: massiv . n: integer) . {сортировка Шелла}

begin

d:=n .

d:=d div 2 .

while (d&gt .0) do

begin

for i:=1 to n-d do

begin

j:=i .

while ((j&gt .0) and (A[j]&gt .A[j+d])) do

begin

count:=A[j] .

A[j]:=A[j+d] .

A[j+d]:=count .

j:=j-1 .

end .

end .

d:=d div 2 .

end .

writeln .

for i:=1 to n do write( , A[i]) . {вывод массива}

end .

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

write(Размер массива &gt . ) .

read(n) .

for i:=1 to n do {ввод массива}

begin

write(i, элемент &gt . ) .

readln(A[i]) .

end .

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

Shell(A, n) .

end.

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

  Сортировка вставками Сортировка Шелла Быстрая сортировка
Худший случай O (n2) O (n 2) O (n 2)
Лучший случай O (n) O (n log n) O (n log n)
Средний случай O (n 2) Зависит от расстояния между элементами O (n log n)



Поделиться статьей
Автор статьи
Анастасия
Анастасия
Задать вопрос
Эксперт
Представленная информация была полезной?
ДА
61.19%
НЕТ
38.81%
Проголосовало: 1510

или напишите нам прямо сейчас:

Написать в WhatsApp Написать в Telegram

ЯТТС-Рекомендации по написанию отчета по учебной и производственной практики-Гостинечное дело

Поделиться статьей

Поделиться статьейПоделиться статьей Автор статьи Анастасия Задать вопрос Эксперт Представленная информация была полезной? ДА 61.19% НЕТ 38.81% Проголосовало: 1510


Поделиться статьей

ЮУрГУ-вопросы

Поделиться статьей

Поделиться статьейПоделиться статьей Автор статьи Анастасия Задать вопрос Эксперт Представленная информация была полезной? ДА 61.19% НЕТ 38.81% Проголосовало: 1510


Поделиться статьей

ЮУГУ-Отчет_ПП-Машины непрерывного транспорта

Поделиться статьей

Поделиться статьейПоделиться статьей Автор статьи Анастасия Задать вопрос Эксперт Представленная информация была полезной? ДА 61.19% НЕТ 38.81% Проголосовало: 1510


Поделиться статьей

ЮУГУ- Курсовой проект по электронике

Поделиться статьей

Поделиться статьейПоделиться статьей Автор статьи Анастасия Задать вопрос Эксперт Представленная информация была полезной? ДА 61.19% НЕТ 38.81% Проголосовало: 1510


Поделиться статьей

ЮУГУ-ВКР-Обеспечение требований охраны труда на рабочем месте слесаря-ремонтника 5 разряда

Поделиться статьей

Поделиться статьейПоделиться статьей Автор статьи Анастасия Задать вопрос Эксперт Представленная информация была полезной? ДА 61.19% НЕТ 38.81% Проголосовало: 1510


Поделиться статьей

или напишите нам прямо сейчас:

Написать в WhatsApp Написать в Telegram
Заявка
на расчет