Виды алгоритмов сортировки Сортировка пузырьком / Bubble sort
Виды алгоритмов сортировки
Сортировка слиянием / Merge sort Сортировка слиянием - это алгоритм типа “разделяй и властвуй”. Общая идея алгоритма: Массив разбивается на две части примерно одинакового размера. Разбиение получившихся массивов повторяется до тех пор, пока размер каждого массива не достигнет единицы. Каждая из получившихся частей сортируется отдельно, после чего происходит слияние двух массивов следующим образом: На каждом шаге сравниваем первые элементы массивов, берём наименьшее значение и записываем в результирующий массив. Когда один из массив закончился, добавляем оставшиеся элементы второго массива в результирующий массив. Слияние подмассивов продолжается до тех пор, пока не получим один, отсортированный массив. Пример реализации на Kotlin: fun mergeSort(list: List if (list.size <= 1) { return list } val middle = list.size / 2 var left = list.subList(0, middle) var right = list.subList(middle, list.size) return merge(mergeSort(left), mergeSort(right)) } Пример реализации на С++: fun merge(left: List var indexLeft = 0 var indexRight = 0 var newList: MutableList while (indexLeft < left.count() && indexRight < right.count()) { if (left[indexLeft] <= right[indexRight]) { newList.add(left[indexLeft]) indexLeft++ } else { newList.add(right[indexRight]) indexRight++ } } while (indexLeft < left.size) { newList.add(left[indexLeft]) indexLeft++ } while (indexRight < right.size) { newList.add(right[indexRight]) indexRight++ } return newList; } void MergeSort (int* x, int first, int last) { if (first < last) { int split = (first + last) / 2; MergeSort (x, first, split); MergeSort (x, split + 1, last); Merge (x, first, split, last); } } void Merge (int* x, int first, int split, int last) { int pos1 = first, pos2 = split + 1, pos3 = 0; int* temp = new int [last — first + 1]; while (pos1 <= split && pos2 <= last) { if (x [pos1] < x [pos2]) temp [pos3++] = x [pos1++]; else temp [pos3++] = x [pos2++]; } while (pos2 <= last) temp [pos3++] = x [pos2++]; while (pos1 <= split) temp [pos3++] = x [pos1++]; for (int i = 0; i < last — first + 1; ++i) x [first + i] = temp [i]; } жүктеу/скачать 121,16 Kb. Достарыңызбен бөлісу: |