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

Сортировка простыми включениями.

Элементы условно разделяют на готовую последовательность а1, … , а i–1 и входную последовательность а i, … , а n. На каждом шаге, начиная с i = 2 и увеличивая i на единицу, берут i – ый элемент входной последовательности и передают в готовую последовательность, помещая его на подходящее место. Алгоритмы сортировки простыми включениями (метод «погружения» и метод «включения») выглядят следующим образом:

void Sort_Load (int m[],int n)

{

int c, i, j;

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

for (j = i; j!= 0; j --)

{

if(m[j] > m[j-1]) break;

c = m[j];

m[j] = m[j–1];

m[j–1] = c;

}

}

void Sort_Includ (int m[],

int n)

{

int c, i, j, k;

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

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

if (m[i] < m[j])

{c = m[i];

for(k = i;k != j;k --)

m[k] = m[k – 1];

m[j] = c;

}

}

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

Анализ сортировки простыми включениями. Число С i сравнений ключей при i-ом просеивании составляет самое большее i-1, самое меньшее 1 и, если предположить, что все перестановки n ключей равновероятны, в среднем равно i/2. Число М i пересылок (присваиваний) равно Сi+2. Поэтому общее число сравнений пересылок следующее

C min = n – 1 M min = 2 (n - 1)

C ср. = ¼ (n2 + n – 2 ) M ср. = ¼ (n2 + 9n - 10)

C max = ½ (n2 + n) – 1 M max = ½ (n2 + 3n - 4)

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

Сортировка простым выбором.

Метод основан на следующем правиле: выбирается элемент с наименьшим ключом, он меняется местами с первым элементом; затем эти операции повторяются с оставшимися n – 1 элементами, затем с n – 2 элементами, пока не останется только один элемент – наибольший. Алгоритм сортировки можно представить следующим образом:

void Sort_Select (int m[], int n)

{

int i, j, c, k ;

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

{k = i;

for( j = i + 1; j < n; j ++)

if ( m[j] < m[k] ) k = j;

c = m[k]; m[k] = m[i]; m[i] = c;

}}

Анализ сортировки простым выбором. Число сравнений ключей

C = ½ (n2 - n) не зависит от начального порядка ключей. Минимальное число пересылок равно M min = 3 (n - 1) в случае изначально упорядоченных ключей и принимает наибольшее значение M max = trunc (n2/4) + 3 (n - 1), если вначале ключи расположены в обратном порядке. M ср. = n (ln n + 0.57).

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