Вступ до об'єднання алгоритмів сортування в Java

Алгоритми сортування об'єднань дуже важливі для інформатики. Результатом сортування є упорядкування елементів списку в певному порядку (або за зростанням, або за убуванням). Сортування об'єднань - це один з найефективніших алгоритмів сортування, який базується на концепції поділу та перемоги. Як випливає з назви, спочатку розділіть більшу проблему на невеликі проблеми, ніж вирішіть менші проблеми, щоб вирішити більшу проблему. У цій статті ми обговоримо алгоритми злиття сортування на Java. Концептуально сортування об'єднань - це комбінація двох основних алгоритмів під назвою MERGE та MERGE_SORT, яка працює наступним чином:

  1. Розподіліть несортований список на n кількість однопозиційних підсписів (n - загальна кількість елементів у несортованому списку).
  2. Неодноразово об’єднуючи підлистики в упорядковані списки, поки не буде лише одного відсортованого списку.

Впровадження алгоритмів сортування злиття в Java

Алгоритм MERGE - це процедура об'єднання двох відсортованих списків в один відсортований список.

Приклад: Припустимо, є два списки, тобто список 1 (6, 3) та список 2 (3, 1, 9).

1. Спочатку сортуйте обидва списки.

Список 1

Список 2

Тепер ми застосуємо до нього техніку злиття.

  1. Тоді ми створимо новий список розміром m + n, де m - кількість елементів у Переліку 1, а n - кількість елементів у Списку 2.

Список 3

У нашому випадку m = 2 і n = 3, тому m + n = 5.

  1. Тепер у нас є двопоказник. Перший вказівник, що вказує на першу позицію Списку 1, і Другий вказівник, що вказує на першу позицію Списку 2.

4. Тоді ми порівняємо значення обох покажчиків. Вказівник із меншим значенням скопіюйте цей елемент у Список 3 та перемістіть вказівник праворуч від списку із меншим значенням та списком, що отримується, (Список 1 та Список 3).

5. Аналогічно виконуйте крок 4 знову і знову.

Подальше подорож… ..

ПРИМІТКА. Якщо один із списків (тобто список 1 або список 2) повністю пройде, як у вищенаведеному випадку, то скопіюйте весь вміст інших списків із вказівника на список результатів (тобто список 3) наступним чином.

Алгоритм та псевдокод

Два алгоритми, використовувані в алгоритмі злиття, є:

  • MERGE (ARR, F, M, L) - це процес, який передбачає наступне:
  1. ARR (F… .M) та ARR (M + 1… .L) є сортованими списками.
  2. Об'єднує два відсортовані підсписи в один ARR (F… .L).
  • SORT (ARR (), F, L) // тут F - перший, а L - останній індекс масиву.

Якщо (L> 1)

  1. Знайдіть середню точку, щоб розділити список на дві половини:

середина M = (F + L) / 2

  1. Сортувати злиття для першого тайму:

Дзвінок SORT (ARR, 1, M)

  1. Сортувати злиття для другої половини:

Дзвінок SORT (ARR, M + 1, L)

  1. Об’єднайте половинки, відсортовані на етапах 2 та 3:

Дзвінок MERGE (ARR, L, M, R)

Приклад

Візьмемо для прикладу ARR масиву (10, 6, 8, 5, 7, 3, 4). Ми будемо використовувати алгоритм Злиття, щоб сортувати масив, використовуючи його Метод поділу та перемоги. Знизу ми бачимо, що Масив рекурсивно ділиться на дві половини, поки розмір не стане 1. Після того як розмір стане 1, ми викликаємо процеси злиття і починаємо об’єднання списків до повного злиття списку.

ПРИМІТКА. На рисунку нижче цифри червоним кольором позначають порядок обробки кроків для формування відсортованого масиву.

Код програми:

import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)
import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)
import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)
import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)
import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)

Вихід:

Висновок - Об’єднайте алгоритми сортування в Java

Найкращі сортування злиття, найгірші та середні показники часу складності однакові, що робить його більш ефективним алгоритмом. Це працює швидше, ніж інші методи сортування. Сортування сортування може бути застосоване до файлів будь-якого розміру. Це дуже паралельно завдяки використанню методу ділення та перемоги. Для того, щоб виробити міцні основи інформатики, вам рекомендується ретельно розібратися в різних алгоритмах сортування.

Рекомендовані статті

Це посібник з об'єднання алгоритмів сортування на Java. Тут ми обговорюємо реалізацію алгоритмів сортування злиття в java та алгоритму та псевдокоду з прикладом. Ви також можете ознайомитися з іншими запропонованими нами статтями -

  1. Сортування вибору в Java
  2. Випадок справи на Java
  3. Доступ до модифікаторів на Java
  4. Об’єднання Сортування в JavaScript
  5. Що таке випадок справи у JavaScript?
  6. Доступ до модифікаторів у PHP
  7. Швидке сортування алгоритмів на Java
  8. Повне керівництво по сортуванню в C # з прикладами
  9. Функція сортування в Python за допомогою прикладів
  10. Топ-6 алгоритмів сортування в JavaScript