Все лекции программирование
.pdfСортировка
Сортировка – это упорядочивание набора однотипных данных по возрастанию или убыванию.
Чаще всего при сортировке данных лишь часть их используется в качестве ключа сортировки. Ключ – это часть информации, определяющая порядок элементов. Таким образом, ключ участвует в сравнениях, но при обмене элементов происходит перемещение всей структуры данных. Например, в списке почтовой рассылки в качестве ключа может использоваться почтовый индекс, но сортируется весь адрес.
Классы алгоритмов сортировки
Существует три общих метода сортировки массивов:
•
•
•
Обмен Выбор (выборка) Вставка
Чтобы отсортировать колоду карт методом обмена, необходимо разложить ее на столе лицом вверх и меняйте местами карты, расположенные не по порядку, пока вся колода не будет упорядочена.
В методе выбора карты раскладываются на столе, выбирается карта
наименьшей значимости. Затем из оставшихся карт снова выбирается карта
наименьшей значимости и кладется на ту, которая уже выбрана. Процесс повторяется до тех пор, пока все карты не будут отсортированы.
Чтобы отсортировать колоду методом вставки, возьмите все карты в руку. Выкладывайте их по одной на стол, вставляя каждую следующую карту в
соответствующую позицию. Когда все карты окажутся на столе, колода будет
отсортирована.
Пузырьковая сортировка
Самый известный алгоритм – пузырьковая сортировка (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.