Merge sort - самый популярный алгоритм сортировки, основанный на принципе алгоритма "разделяй и властвуй".
Хотя существует множество алгоритмов сортировки, merge-sort доказал, что его временная сложность составляет O(аналог n). И в некоторых случаях он имеет лучшую временную сложность, чем его конкурент Quick sort.
Алгоритм сортировки слиянием использует технику "Разделяй и властвуй", чтобы сначала разделить массив на все его элементы и начать сравнивать два соседних массива и объединять их в один массив на основе порядка. Он следует той же схеме для следующих двух соседних элементов и так далее. Этот процесс продолжается до тех пор, пока не останется только один единственный массив, и это будет отсортированный массив.
Визуализацию сортировки слияния можно посмотреть ниже
Давайте посмотрим на реализацию кода
def mergeSort(array): if len(array) <= 1: return mid = len(array)//2 left = array[:mid] right = array[mid:] mergeSort(left) mergeSort(right) i = j = k = 0 while i < len(left) and j < len(right): if left[i] < right[j]: array[k] = left[i] i += 1 else: array[k] = right[j] j += 1 k += 1 while i < len(left): array[k] = left[i] i += 1 k += 1 while j < len(right): array[k] = right[j] j += 1 k += 1 x = [8, 1, 5, 7, 9, 3, 2, 4, 6] print(x) mergeSort(x) print(x)
Вы можете использовать этот онлайн-компилятор для выполнения этого кода.
function mergeSort(array){ if (array.length <= 1) return; let mid = parseInt(array.length/2) let left = array.slice(0,mid) let right = array.slice(mid) mergeSort(left) mergeSort(right) let i = 0, j = 0, k = 0; while (i < left.length && j < right.length){ if (left[i] < right[j]){ array[k] = left[i] i += 1 } else{ array[k] = right[j] j += 1 } k += 1 } while (i < left.length){ array[k] = left[i] i += 1 k += 1 } while (j < right.length){ array[k] = right[j] j += 1 k += 1 } } let x = [8, 1, 5, 7, 9, 3, 2, 4, 6] console.info(x) mergeSort(x) console.info(x)
Вы можете использовать этот онлайн-компилятор для выполнения этого кода.
class Sorting { public static void mergeSort(int[] arr) { if (arr.length > 1) { int mid = (int) arr.length / 2; int[] left = new int[mid]; int[] right = new int[arr.length - mid]; for (int i = 0; i < mid; i++) { left[i] = arr[i]; } for (int i = 0; i < arr.length - mid; i++) { right[i] = arr[i + mid]; } mergeSort(left); mergeSort(right); int i = 0, j = 0, k = 0; while (i < left.length && j < right.length) { if (left[i] < right[j]) { arr[k] = left[i]; i++; } else { arr[k] = right[j]; j++; } k++; } while (i < left.length) { arr[k] = left[i]; k++; i++; } while (j < right.length) { arr[k] = right[j]; k++; j++; } } } public static void printArray(int[] arr) { System.out.print("["); for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) System.out.println(arr[i] + "]"); else System.out.print(arr[i] + ", "); } } public static void main(String[] args) { int[] x = { 8, 1, 5, 7, 9, 3, 2, 4, 6 }; printArray(x); mergeSort(x); printArray(x); } }
Вы можете использовать этот онлайн-компилятор для выполнения этого кода.
#include <iostream> void mergeSort(int arr[], int size) { if (size > 1) { int middle = (int) size / 2; int left[middle]; int right[size - middle]; for (int i = 0; i < middle; i++) { left[i] = arr[i]; } for (int i = 0; i < size - middle; i++) { right[i] = arr[i + middle]; } mergeSort(left, middle); mergeSort(right, size - middle); int i = 0, j = 0, k = 0; while (i < middle && j < size - middle) { if (left[i] < right[j]) { arr[k] = left[i]; i++; } else { arr[k] = right[j]; j++; } k++; } while (i < middle) { arr[k] = left[i]; k++; i++; } while (j < size - middle) { arr[k] = right[j]; k++; j++; } } } void printArray(int arr[], int size) { std::cout << "["; for (int i = 0; i < size; i++) { if (i == size - 1) std::cout << arr[i] << "]" << std::endl; else std::cout << arr[i] << ", "; } } int main() { int x[] = { 8, 1, 5, 7, 9, 3, 2, 4, 6 }; int size = sizeof(x) / sizeof(x[0]); printArray(x, size); mergeSort(x, size); printArray(x, size); return 0; }
Вы можете использовать этот онлайн-компилятор для выполнения этого кода.
<?php function mergeSort(&$array) { if (count($array) <= 1) return; $mid = (int) (count($array) / 2); $left = array_slice($array, 0, $mid); $right = array_slice($array, $mid); mergeSort($left); mergeSort($right); $i = 0; $j = 0; $k = 0; while ($i < count($left) && $j < count($right)) { if ($left[$i] < $right[$j]) { $array[$k] = $left[$i]; $i += 1; } else { $array[$k] = $right[$j]; $j += 1; } $k += 1; } while ($i < count($left)) { $array[$k] = $left[$i]; $i += 1; $k += 1; } while ($j < count($right)) { $array[$k] = $right[$j]; $j += 1; $k += 1; } } $x = array(8, 1, 5, 7, 9, 3, 2, 4, 6); echo json_encode($x) . "\n"; mergeSort($x); echo json_encode($x); ?>
Вы можете использовать этот онлайн-компилятор для выполнения этого кода.
Конец статьи. Спасибо за прочтение!
Загляните на мой сайт, чтобы прочитать больше подобных статей!
20.08.2023 18:21
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".
20.08.2023 17:46
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
19.08.2023 18:39
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
19.08.2023 17:22
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!
18.08.2023 20:33
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.
14.08.2023 14:49
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.