Файл: Алгоритмы сортировки данных (Что такое алгоритм).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 29.02.2024

Просмотров: 46

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

return right

}

swap(ar, left, right)

}

}

func swap(array *[]int, i int, j int) {

var dArray = *array;

dArray[i], dArray[j] = dArray[j], dArray[i];

}

Пример сортировки массива

Начальное состояние

5 3 8 0 7 4 9 1 6 2

4 3 1 0 2 5 9 8 6 7

1 0 2 3 4 5 6 7 9 8

0 1 2 3 4 5 6 7 8 9

9. Пирамидальная сортировка

Двоичным (бинарным) деревом называют структуру данных, где каждому элементу поставлены в соответствие до трех других элементов: левый и правый “потомки” и “родитель”. Левый потомок должен быть меньше, а правый – больше или равен родителю. Единственный элемент, не имеющий родителя, называется корнем дерева.

Делим массив на две части - не отсортированная и отсортированная. На не отсортированной части строим бинарное дерево. Строим по правилу, что потомки не больше предка, корень располагаем по индексу 0, а индексы листьев вычисляем по формуле 2i+1, 2i+2. В итоге, в корне оказывается наибольшее значение. Дальше мы меняем местами значения в начале и в конце неупорядоченной зоны. Получается, что отсортированная часть выросла на 1 элемент, неотсортированная уменьшилась на 1. Опять перестраиваем дерево, и повторяем все шаги пока полностью не отсортируем.

Сложность алгоритма в лучшем и худшем случае одинакова, О(n log n), те данная скорость является гарантированной. Данный алгоритм активно применяется в ядре операционной системы Linux.

Пример реализации алгоритма на языке Go:

func HeapSort(ar []int) {

if len(ar) < 2 {

return

}

heapIt(ar)

ar[0], ar[len(ar)-1] = ar[len(ar)-1], ar[0]

HeapSort(ar[:len(ar)-1])

}

func heapIt(ar []int) {

if len(ar) < 2 {

return

}

if len(ar) == 2 {

if ar[0] < ar[1] {

ar[0], ar[1] = ar[1], ar[0]

}

return

}

if len(ar) > 3 {

heapIt(ar[1:])

heapIt(ar[2:])

}

if ar[1] > ar[2] {

if ar[0] < ar[1] {

ar[0], ar[1] = ar[1], ar[0]

}

} else {

if ar[0] < ar[2] {

ar[0], ar[2] = ar[2], ar[0]

}

}

}

10. Сортировка слиянием

Этот алгоритм следует принципу “разделяй и властвуй”, те разбивает одну большую и сложную задачу на множество маленьких и простых подзадач. Алгоритм разделяет вводные данные на куски, сортирует их, и затем “сливает” их вместе. Разделение массива происходит на две части, затем метод сортировки рекурсивно вызывает себя на на каждый из этих частей, а затем сливает полученный результат.


Особенностью этого алгоритма является то, что он подходит для работы со структурами данных последовательного доступа, а не только с массивами. Например, списки - каждый элемент может только лишь получить значение следующего элемента, нельзя получить сразу все значения. Также, как и многие алгоритмы, следующие принципу “разделяй и властвуй”, хорошо подходит для распараллеливания. Гарантированная сложность алгоритма: О(n log2n).

Из очевидных недостатков - на почти отсортированных данных алгоритм работает почти столько же, сколько и на совсем не отсортированных.

Пример реализации алгоритма на языке Go:

func mergeSort(items []int) []int {

var num = len(items)

if num == 1 {

return items

}

middle := int(num / 2)

var (

left = make([]int, middle)

right = make([]int, num-middle)

)

for i := 0; i < num; i++ {

if i < middle {

left[i] = items[i]

} else {

right[i-middle] = items[i]

}

}

return merge(mergeSort(left), mergeSort(right))

}

func merge(left, right []int) (result []int) {

result = make([]int, len(left) + len(right))

i := 0

for len(left) > 0 && len(right) > 0 {

if left[0] < right[0] {

result[i] = left[0]

left = left[1:]

} else {

result[i] = right[0]

right = right[1:]

}

i++

}

for j := 0; j < len(left); j++ {

result[i] = left[j]

i++

}

for j := 0; j < len(right); j++ {

result[i] = right[j]

i++

}

return

}

Пример сортировки массива

Начальное состояние

37824615

3 | 7 | 8 | 2 | 4 | 6 | 1 | 5

37 | 28 | 46 | 15

2378 | 1456

12345678

11. Заключение

Сортировка применяется во всех без исключения областях программирования, математические программы, игры, офисные приложения и так далее. Алгоритмы сортировки представляют собой пошаговое упорядочение элементов в определенном массиве данных, вне зависимости от размером массива. Практически каждый алгоритм сортировки можно разбить на три части: сравнение, определяющее порядок пары элементов; перестановку, меняющую пару элементов местами; сортирующий алгоритм, осуществляющий сравнение и перестановку элементов, пока все элементы не будут в правильном порядке. Выбор метода сортировки в значительной мере зависит от объема и характеристики исходных данных. Но, в целом, основными параметрами, которыми руководствуется пользователь при выборе метода сортировки, являются время действия алгоритма, память, устойчивость сортировки и эффективность поведения алгоритма.

Наиболее используемые алгоритмы сортировки в современном программировании: быстрая сортировка, пирамидальная сортировка, сортировка слиянием.


В качестве практической части - были реализованы описанные в данной работе алгоритмы с использованием современного языка программирования общего назначения - Go.

12. Список использованной литературы

1. Effective Go - https://golang.org/doc/effective_go.html

2. Ткачук В. А. Алгоритмы сортировки

3. Бинарные деревья - https://habr.com/ru/post/267855/

4. Описание алгоритмов сортировки и их сравнения - https://habr.com/ru/post/335920/

5. Алгоритмы сортировки - http://algolist.ru/sort/

6. Алгоритмы сортировки в Go - https://github.com/TheAlgorithms/Go]

7. Алгоритмы сортировки - https://ru.wikipedia.org/wiki/Алгоритм_сортировки