Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Все лекции программирование

.pdf
Скачиваний:
25
Добавлен:
13.03.2016
Размер:
1.94 Mб
Скачать

Сортировка

Сортировка – это упорядочивание набора однотипных данных по возрастанию или убыванию.

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

Классы алгоритмов сортировки

Существует три общих метода сортировки массивов:

Обмен Выбор (выборка) Вставка

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

В методе выбора карты раскладываются на столе, выбирается карта

наименьшей значимости. Затем из оставшихся карт снова выбирается карта

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

Чтобы отсортировать колоду методом вставки, возьмите все карты в руку. Выкладывайте их по одной на стол, вставляя каждую следующую карту в

соответствующую позицию. Когда все карты окажутся на столе, колода будет

отсортирована.

Пузырьковая сортировка

Самый известный алгоритм – пузырьковая сортировка (bubble sort, сортировка методом пузырька, или просто сортировка пузырьком). В общем случае это один из самых худших алгоритмов сортировки.

Пузырьковая сортировка относится к классу обменных сортировок, т.е. к классу сортировок методом обмена. Ее алгоритм содержит повторяющиеся сравнения (т.е. многократные сравнения одних и тех же элементов) и, при необходимости, обмен соседних элементов. Элементы ведут себя подобно пузырькам воздуха в воде – каждый из них поднимается на свой уровень.

Пример

#include <string.h> #include <stdio.h> #include <stdlib.h>

void bubble(char *items, int count);

int main(void)

{

char s[255];

printf("Input string:"); gets(s);

bubble(s, strlen(s)); printf("Sorted string: %s.\n", s);

return 0;

}

void bubble(char *items, int count)

{

register int a, b; register char t;

for(a=1; a < count; ++a) for(b=count-1; b >= a; --b) {

if(items[b-1] > items[b]) { /* exchange elements */ t = items[b-1]; items[b-1] = items[b]; items[b] = t;

}

}

}

Input string: fsfdsfadfdfsd

Sorted string: addddfffffsss.

Вычислительная сложность

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

(n2-n)/2

сравнений, где n – количество сортируемых элементов.

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

При сортировке посредством выбора из массива выбирается элемент с наименьшим значением и обменивается с первым элементом. Затем из оставшихся n - 1 элементов снова выбирается элемент с наименьшим ключом и обменивается со вторым элементом, и т.д. Эти обмены продолжаются до двух последних элементов.

void select(char *items, int count)

{

register int a, b, c; int exchange; char t;

for(a=0; a < count-1; ++a) { exchange = 0;

c = a;

t = items[a];

for(b=a+1; b < count; ++b) { if(items[b] < t) {

c = b;

t = items[b]; exchange = 1;

}

}

if(exchange) { items[c] = items[a]; items[a] = t;

}

printf("ex->%s\n",items);

}

}

Пример

Input string: dcab ex->acdb ex->abdc ex->abcd

Sorted string: abcd.

Вычислительная сложность

Как и в пузырьковой сортировке, внешний цикл выполняется n-1 раз, а внутренний – n/2 раз. Следовательно, сортировка посредством выбора требует

(n2-n)/2

сравнений.

Сортировка вставками

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

Пример

void insert(char *items, int count)

{

register int a, b; char t;

for(a=1; a < count; ++a) { t = items[a];

for(b=a-1; (b >= 0) && (t < items[b]); b--) items[b+1] = items[b];

items[b+1] = t; printf("ex->%s\n",items);

}

}

Input string: dcab ex->cdab ex->acdb ex->abcd

Sorted string: abcd.