Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Алгоритм простого выбора (выбором)Стр 1 из 4Следующая ⇒
Методы внутренней сортировки Пусть определен следующий тип данных type mas = array [1.. n ] of typel; var a: mas; Алгоритмы простой сортировки Алгоритм простой вставки (прямого включения) Метод основан на использовании двух подпоследовательностей: ü готовую отсортированную часть, начиная с первого элемента (a 1.. a i); ü входную, из которой вначале выбираются элементы (a i.. a n). На каждом i –ом шаге сортировки из входной последовательности выбирается j –ый элемент и в готовой последовательности определяется соответствующее место вставки элементов. На шаге n – 1 массив отсортирован. Отсортированная часть рассматривается с конца. Элемент a i сравнивается последовательно с ai-1, ai-2 … и ищется место a i в упорядоченной последовательности. Ищется первый элемент a j < a i и a i вставляется правее a j. Если выполняется сортировка в порядке возрастания, то осуществляется поиск соответствующего места «справа – налево» до тех пор пока выполняется условие x < a j, где x – сортируемый элемент. Пусть дана последовательность целых чисел: 44 55 12 42 94 18 6 67 1) 44 55 12 42 94 18 6 67 2) 12 44 55 42 94 18 6 67 3) 12 42 44 55 94 18 6 67 4) 12 18 42 44 45 94 6 67 … procedure IncludeSort; var i, j: integer; x: typel; Begin for i: = 2 to n do Begin x: = a [ i ]; j: = i – 1; while (a [ i ] > x) and (j > 0) do Begin a [ j + 1]: = a [ j ]; j: = j – 1; end; a [ j + 1]: = x; end; end; Оценка» ½ перемещений и пересылок Cmin = n – 1 Mmin = 3(n –1) Cср = (n2 + n – 2)/4 Mср = (n2 + 9n –10)/4 Cmax = (n2 + n – 4)/4 Mmax = (n2 + 3n –4)/4
Общее число пересылок и перемещений Tn = О (n2) C = О (n 2) M = O (n 2) В качестве улучшения данного алгоритма придется ускорить поиск места для вставки с помощью метода половинного деления (заменить цикл while в упорядоченной части).Число сравнений уменьшится C = О (n log 2 n), а число перестановок то же, что не дает значительного эффекта. Если алгоритм применить к отсортированному массиву, то цикл while вырождается, т.е алгоритм реагирует на предварительную отсортированность массива (хотя бы частичную). Алгоритм простого выбора (выбором) Данный метод основан на поиске элемента из оставшейся последовательности и его перестановку на место, с которого начинался поиск 44 55 12 42 94 18 6 67 Иначе говоря данный алгоритм является пошаговым и на каждом шаге массив разбивается на два подмассива: ü отсортированный ü неотсортированный i = 1, …, n – 1. Причем на каждом шаге отыскивается минимальный элемент и меняется местами с первым элементом неотсортированной части. В результате неотсортированная часть становится на один элемент короче. В нашем примере 1) 6 55 12 42 94 18 44 67 2) 6 12 55 42 94 18 44 67 3) 6 12 18 42 94 55 44 67 4) 6 12 18 42 44 55 94 67 5) 6 12 18 42 44 55 67 94 Алгоритм: procedure SelectSort; var i, j, m: integer; x: typel; Begin for i: = 1 to n – 1 do Begin m: = i; for j: = i +1 to n do if a [ j ] < a [ m ] then m: = j; x: = a [ i ]; a [ i ]: = a [ m ]; a [ m ]: = x; end; end; Оценка по числу сравнений: Mmin = 3(n–1) Mср = n (ln (n)+ g) Mmax = n 2/4 + 3(n –1) g – константа Эйлера (0.577216). Число сравнений C = O (n 2); число перемещений M = O (n log2 n). Общая оценка T n = O (n 2). Алгоритм не реагирует на предварительную сортировку.
|