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

C_Kurs_Lekt / C_III_семестр / 17-6_Сортировка

.pdf
Скачиваний:
10
Добавлен:
13.02.2016
Размер:
164.27 Кб
Скачать

Сортировка Лысый Д.А.

НЕКОТОРЫЕ СВЕДЕНИЯ О СОРТИРОВКЕ И ПОИСКЕ

Основными операциями, выполняемыми над таблицами, являются упорядочение (сортировка) записей, поиск в таблице записи по заданному условию( по ключу ), удаление и вставка элементов. Сортировка является операцией расстановки записей таблицы в определенном порядке в соответствии с некоторым критерием упорядочения. Сортировка осуществляется в соответствии со значением ключей всех записей (напр., упорядочение фамилий по алфавиту или чисел по возрастанию ). Существует достаточно много методов сортировки, принципиально отличающихся друг от друга. Если таблица целиком помещается в оперативной памяти ЭВМ,то ее упорядочение называют внутренним. Если для хранения упорядочиваемых данных используются внешнее запоминающее устройство, то такое упорядочение называют внешним. Критериями оценки методов сортировки

являются :

 

 

 

С - количество операций сравнения пар ключей,

 

Ð -

число перестановок элементов ,

 

S -

резерв памяти.

 

 

Среднее

количество операций

сравнения зависит от

метода

сортировки и при рациональном выборе метода достигает некоторого минимума, зависящего от n - размера таблицы ( размер таблицы - количество содержащихся в ней записей). Методы внутренней сортировки можно разделить на две группы:

-методы, не требующие резерва памяти;

-методы, требующие резерва памяти.

Êпервой группе относятся такие методы, как метод выборки, "пузырька", вставки, Шелла. Ко второй группе относятся метод квадратичной

выборки, метод слияния и другие. Простые методы сортировки (выбором, обменом, вставкой) требуют приблизительно n**2 сравнений. Более сложные алгоритмы обычно обеспечивают получение результата за n*log2(n) сравнений в среднем: сортировка методом Шелла, слиянием, "быстрая сортировка". Однако оптимальной в любом случае сортировки не существует, так как их эффективность существенно зависит от типа ключей в таблице и их предварительной упорядоченности.

Оценки времени исполнения

Для оценки производительности алгоритмов можно использовать разные подходы. Самый бесхитростный – просто запустить каждый алгоритм на нескольких задачах и сравнить время исполнения. Другой способ – оценить время исполнения. Например, мы можем утверждать, что время поиска есть O(n) (читается так: о большое от n). Это означает, что при больших n время поиска не сильно больше, чем количество элементов. Когда используют обозначение O(), имеют в виду не точное время исполнения, а только его предел сверху, причем с точностью до постоянного множителя. Когда говорят, например, что алгоритму требуется время порядка O(n2), имеют в виду, что время исполнения задачи растет не быстрее, чем квадрат количества элементов. Чтобы почувствовать, что это такое, посмотрите таблицу 1.1, где

1

Сортировка Лысый Д.А.

приведены числа, иллюстрирующие скорость роста для нескольких разных функций

n

lg n

n lg n

n1.25

n2

1

0

0

1

1

16

4

64

32

256

256

8

2,048

1,024

65,536

4,096

12

49,152

32,768

16,777,216

65,536

16

1,048,565

1,048,476

4,294,967,296

1,048,476

20

20,969,520

33,554,432

1,099,301,922,576

16,775,616

24

402,614,784

1,073,613,825

281,421,292,179,45

 

 

 

 

6

Таблица 1.1: Скорость роста нескольких функций

Если считать, что числа в таблице 1.1 соответствуют микросекундам, то для задачи с 1048476 элементами алгоритму с временем работы O(lg n) потребуется 20 микросекунд, алгоритму с временем работы O(n1.25) – порядка 33 секунд, алгоритму с временем работы O(n2) – более 12 дней. В нижеследующем тексте для каждого алгоритма приведены соответствующие O-оценки. Более точные формулировки и доказательства можно найти в приводимых литературных ссылках.

Обменная сортировка Название этой группы методов произошло от основного типа операций,

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

Метод пузырька Алгоритм довольно очевиден. Рассмотрим работу алгоритма на примере

файла из 16 элементов:

исх. проход

 

1

 

2

 

 

проход 4

 

 

проход

7

8

файл

 

¦

 

проход

 

 

 

¦

проход 5

¦

проход

¦

 

¦

 

 

¦

проход 3

¦

 

¦

проход 6 ¦

 

¦

проход 9

¦

 

¦

 

 

¦

 

¦

 

 

¦

 

¦

¦

¦

 

¦

¦

703

-->908

 

 

908

 

908

 

 

908

 

908

908

908

 

908

908

765

¦

703

 

->897

 

897

 

 

897

 

897

897

897

 

897

897

677

¦

765

 

¦

703

->765

 

 

703

 

703

703

703

 

703

703

612

¦

677

 

¦

765---

703

 

 

765

 

765

765

765

 

765

765

509

¦

612

 

¦

677

 

677

 

 

677

 

677

677

677

 

677

677

154

¦

509

 

¦

612

->653

 

 

653

 

653

653

653

 

653

653

426

¦

154

 

¦

509

¦

612

 

 

612

 

612

612

612

 

612

612

653

¦

426

 

¦

154

¦

509

-->512

 

512

512

512

 

512

512

275

¦

653

 

¦

426

¦

154

¦

 

509

 

509

509

509

 

509

509

897

¦

275

 

¦

653---

426

¦

 

154

->503

503

503

 

503

503

170

¦

897---

275

->512--

 

426

¦

154

->426

426

 

426

426

908--

170

-->512---

275

 

->503--

426-- 154 ->275

 

275

275

61

-->512--

 

170

 

503---

275

 

275

275-- 154

->170

170

512--

61

-->503

 

170

 

 

170

 

170

170

170--

154

154

87

-->503--

 

61

->87

 

 

87

 

87

87

87

 

87

87

503--

87

 

 

87 ---

61

 

 

61

 

61

61

61

 

61

61

2

Сортировка Лысый Д.А.

Пары стоящих рядом элементов просматриваются в направлении снизу вверх и сравниваются. Если верхний элемент оказывается меньше нижнего по рисунку, то они меняются местами. Продолжая этот процесс циклически, мы в конце концов придем к отсортированному файлу. Файл расположен вертикально снизу вверх, чтобы эффект всплывающего пузырька выглядел более наглядно. Элементы с большим значением ключа "всплывают" наверх, после последовательных сравнений с соседними элементами.

Характеристики сортировки методом "пузырька" в худшем случае составляют n(n-1)/2 сравнений и n(n-1)/2 перестановок (худшим считается случай, когда элементы наиболее удалены от своих конечных позиций).

Среднее число сравнений и перестановок имеет порядок n**2 .

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

просматривать как с начала до конца, так и с конца до начала попеременно. Это несколько сокращает число перемещений элементов. Схема перемещений элементов будет в этом случае иметь следующий вид.

исх. проход 1

проход

2

проход

 

4

5

проход 7

файл

 

¦

 

¦

 

проход

¦

¦

 

¦

 

¦

 

проход 3 ¦

 

¦

проход

6 ¦

¦

 

¦

 

¦

 

¦

¦

 

¦

¦

¦

703

-->908

 

908

 

908

908

 

908

908

908

765

¦

703-¬

765

-->897

897

 

897

897

897

677

¦

765

L->703

¦

765

765

 

765

765

765

612

¦

677

 

677

¦

703

703

 

703

703

703

509

¦

612

 

612

¦

677

677

 

677

677

677

154

¦

509

 

509

¦

612

612

->653

653

653

426

¦

154-¬

426

¦

509

509

¦

612

612

612

653

¦

426

¦

653

¦

426-¬ 653--

509-¬

512

512

275

¦

653

¦

275

¦

653

L->426

->512 L>509

509

897

¦

275

¦

897--

275-¬ 512--

426-¬

503

503

170

¦

897

¦

170

-->512 L->275

->503 L>426

426

908--

170

¦

512--

170-¬ 503--

275

275

275

61

-->512

L->154

-->503 L->170

 

170

170

170

512--

61 -¬

503--

154

154

 

154

154

154

87

-->503

¦

87

 

87

87

 

87

87

87

503--

87

L->61

 

61

61

 

61

61

61

Проход 1 осуществлялся с начала в конец, проход 2 - с конца в начало, проход 3 снова с начала в конец и т.д. . Как видно из таблицы, этот алгоритм потребовал на 2 прохода меньше, чем исходный. Такой алгоритм называют «шейкерной» сортировкой.

Алгоритм пузырька имеет следующий вид (сортировка по возрастанию, «топим» мин. элемент). Улучшение – за каждым проходом уменьшаем число сравнений .

for(i=1;i<n,i++) for(j=n-1; j>=i, j--)

if(a[j-1]>a[j]) { x= a[j-1]; a[j-1]= a[j]; a[j]=x;}

3

Сортировка Лысый Д.А.

Алгоритм пузырька: Улучшение – выполняем проходы в разные стороны и «уменьшаем» число сравнений и используем признак завершения сортировки.

#define n 15 // число элементов

...

int j, ende=1,l=1, r=n-1, k=n-1; do {

for(j=l;j>0;j--){

if(a[j-1]>a[j]) { x= a[j-1]; a[j-1]= a[j]; a[j]=x; k=j, ende=0;} l=k+1;

for(j=l;j<=r;j++){

if(a[j-1]>a[j]) { x= a[j-1]; a[j-1]= a[j]; a[j]=x; k=j, ende=0;} r=k-1;

if (ende) break; ende=1;

}

while (!(l>r))

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

Идея метода довольно проста: найти наибольший элемент массива поставить его на место N, найти следующий максимум и поставить его на место N-1 и т.д. до 2-го элемента. Схема алгоритма имеет следующий вид.

for (j=n-1, j>0, j--) { m=j; x=k[m]; for(i=j-1; i>=0,i--)

if(x < k[i]) {x=k[i]; m=i;} k[m]=k[j]; k[j]=x;

}

Время работы алгоритма t примерно оценивается формулой:

t=a*N¤ + b*N*logN где a,b - неизвестные константы, зависящие от программной реализации алгоритма.

Методы вставки. Алгоритм простых вставок.

Ниже описан основной алгоритм простых вставок, который порождает несколько модификаций, используемых в заданиях. Алгоритм использует прием, которым пользуются игроки в карты при сортировке только что розданной колоды: очередная карта вставляется между уже упорядоченными ранее.

for (j=1; j<n; j++) { i=j-1; x=k[j];

while (x<k[i]&&i>=0) {k[i+1]=k[i]; i=i-1;} k[i+1]=x;

}

Для примера возьмем файл, состоящий из 8 элементов:

Исх.файл.: 503 87 512 61 908 170 897 275

4

Сортировка Лысый Д.А.

 

 

 

 

 

 

 

 

Алгоритм будет преобразовывать его следующим образом:

 

j=2. Исх :

503

87

 

X=87

 

 

 

j=3

Рез :

°87

503

°512

 

X=512

 

 

:

87

503

512

 

 

j=4

:

°61

87

503

°908

X=61

X=908

 

j=5

:

61

87

503

512

908

 

j=6

:

61

87

°170

503

512

X=170

X=897

j=7

:

61

87

170

503

512

°897

908

j=8

:

61

87

170

°275

503

512

897 908

X=275

Время работы алгоритма t примерно оценивается формулой: t=a*N¤+ b*N

где a,b - неизвестные константы, зависящие от программной реализации алгоритма.

Модификации алгоритма простых вставок. Бинарные вставки Для ускорения числа сравнений при поиске места, в которое нужно

вставить элемент X, можно использовать логарифмический поиск. Это означает, что сначала Х сравнивается с элементом k[j/2], затем, в зависимости от результата сравнения, с элементом, лежащим посередине между 1 и j/2 или посередине между j/2+1 и j и т.д. . При этом число сравнений для каждого j равно примерно log(j). Число пересылок элементов при этом не изменяется и остается примерно равным N¤/4.

Время работы алгоритма t примерно оценивается формулой:

t=a*N¤ + b*N + c*N*logN где a,b,c - неизвестные константы, зависящие от программной реализации алгоритма.

Вставки с убывающим шагом (метод Шелла)

Идея алгоритма состоит в обмене элементов, расположенных не только рядом, как в алгоритме простых вставок, но и далеко друг от друга, что значительно сокращает общее число операций перемещения элементов. Для примера возьмем файл из 16 элементов. Сначала просматриваются пары с шагом 8. Это пары элементов 1-9, 2-10, 3-11, 4-12, 5-13, 6-14, 7-15, 8-16. Если значения элементов в паре не упорядочены по возрастанию, то элементы меняются местами. Назовем этот этап 8-сортировкой. Следующий этап - 4- сортировка, на котором элементы в файле делятся на четверки: 1-5-9-13, 2- 6-10-14, 3-7-11-15, 4-8-12-16. Выполняется сортировка в каждой четверке. Сортировка может выполняться методом простых вставок. Следующий этап

- 2-сортировка, когда элементы в

файле делятся

на 2 группы по 8: 1-3-5-7-

9-11-13-15 è 2-4-6-8-10-12-14-16.

Выполняется

сортировка

в каждой

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

Время работы алгоритма t примерно оценивается формулой:

t=a*N**b, где a и b - неизвестные константы, зависящие от программной реализации алгоритма.

5

Сортировка Лысый Д.А.

6

Соседние файлы в папке C_III_семестр