Сортировка слиянием
Сортировка слиянием (англ. merge sort) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй».
Алгоритм был изобретён Джоном фон Нейманом в 1945 году.
Реализация на JAVA public class MergeSort { public static void mergesort (int[] a) { mergesort(a, 0, a.length-1); } private static void mergesort (int[] a, int l, int r) { //base case: a[l..r] is empty or has only one element if ( l>=r ) return; //recursion step: a[l..r] is not empty //divide into sublists and merge int m = (l+r)/2; mergesort (a, l, m); mergesort (a, m+1, r); merge (a, l, m, r); } //merges to sublists private static void merge (int[] a, int l, int m, int r) { //base case: second sublist is empty if (m+1>r) return; int[] b = new int[a.length]; //create temporary array //copy a[l..m] to b[l..m] for (int i=l; i!=m+1; i++) { b[i] = a[i]; } //copy a[m+1..r] to b[m+1..r] in reverse order for (int i=m+1; i!=r+1; i++) { b[i] = a[r+m+1-i]; } //merge b[l..m] with b[m+1..r] to a[l..r] int k=l; int j=r; //pointer wandering from outside inward for (int i=l; i!=r+1; i++) { if (b[k] <= b[j]) a[i] = b[k++]; else a[i] = b[j--]; } } } |
Реализация на C |
Реализация на C++ |
Литература
- Ананий В. Левитин Глава 4. Метод декомпозиции: Сортировка слиянием // Алгоритмы: введение в разработку и анализ = Introduction to The Design and Analysis of Aigorithms. — М.: «Вильямс», 2006. — С. 169-172. ISBN 0-201-74395-7
- Википедия