Úvod do sloučení algoritmů třídění v Javě
Algoritmy slučování třídění jsou v informatice velmi důležité. Výstupem třídění je uspořádat prvky seznamu do určitého pořadí (buď vzestupně nebo sestupně). Sloučit řazení je jeden z nejúčinnějších dostupných algoritmů třídění, protože je založen na konceptu dělení a dobývání. Jak název napovídá, nejprve rozdělte větší problém na malé problémy, než vyřešte menší problémy, abyste vyřešili větší problém. V tomto článku budeme hovořit o sloučení třídění algoritmů v Javě. Koncepčně je sloučení třídění kombinací dvou základních algoritmů nazývaných MERGE a MERGE_SORT, které fungují takto:
- Rozdělte netříděný seznam na n počet dílčích seznamů jednotlivých položek (n je celkový počet prvků v netříděném seznamu).
- Opakovaně slučujte seznamy do tříděných seznamů, dokud nebude k dispozici pouze jeden seznam.
Implementace algoritmů sloučení třídění v Javě
Algoritmus MERGE je postup kombinování dvou tříděných seznamů do jednoho tříděného seznamu.
Příklad: Předpokládejme, že existují dva seznamy, tj. Seznam 1 (6, 3) a Seznam 2 (3, 1, 9).
1. Nejprve seřaďte oba seznamy.
Seznam 1
Seznam 2
Nyní na to použijeme techniku slučování.
- Poté vytvoříme nový seznam velikostí m + n, kde m je počet prvků v seznamu 1 a n je počet prvků v seznamu 2.
Seznam 3
V našem případě m = 2 an = 3, takže m + n = 5.
- Nyní máme dva ukazatele. První ukazatel směřující na první pozici seznamu 1 a druhý ukazatel směřující na první pozici seznamu 2.
4. Potom porovnáme hodnotu obou ukazatelů. Ukazatel s menší hodnotou zkopírujte tento prvek do Seznamu 3 a přesuňte ukazatel vpravo od seznamu s menší hodnotou a výsledným seznamem (tj. Seznam 1 a Seznam 3).
5. Podobně proveďte krok 4 znovu a znovu.
Další traverz… ..
POZNÁMKA: Pokud jeden ze seznamů (tj. Seznam 1 nebo seznam 2) zcela projde jako ve výše uvedeném případě, zkopírujte celý obsah ostatních seznamů z ukazatele do seznamu výsledků (tj. Seznam 3) následujícím způsobem.
Algoritmus a pseudokód
Dva algoritmy používané v Merge Algorithm jsou:
- MERGE (ARR, F, M, L) je proces, který předpokládá následující:
- ARR (F… .M) a ARR (M + 1… .L) jsou tříděné seznamy.
- Sloučí dva tříděné seznamy do jednoho ARR (F… .L).
- SORT (ARR (), F, L) // zde F je první a L je poslední index pole.
Pokud (L> 1)
- Najděte prostřední bod pro rozdělení seznamu na dvě poloviny:
střední M = (F + L) / 2
- Volat sloučení třídění pro první polovinu:
Volat SORT (ARR, 1, M)
- Volání slučování pro druhou polovinu:
Volat SORT (ARR, M + 1, L)
- Sloučit poloviny seřazené v kroku 2 a 3:
Volejte MERGE (ARR, L, M, R)
Příklad
Vezměme si příklad pole ARR (10, 6, 8, 5, 7, 3, 4). Algoritmus sloučení použijeme k třídění Array pomocí jeho techniky rozdělení a dobytí. Vidíme níže uvedený obrázek, že pole je rekurzivně rozděleno na dvě poloviny, dokud se velikost nestane 1. Jakmile se velikost stane 1, zavoláme slučovací procesy a začneme slučovací seznamy zpět, dokud nebude úplný seznam sloučen.
POZNÁMKA: Na obrázku níže čísla červeně označují pořadí, ve kterém jsou kroky zpracovány, aby vytvořily tříděné pole.Programový kód:
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);
)
)
Výstup:
Závěr - Sloučit algoritmy třídění v Javě
Sloučit řazení nejlepší, nejhorší a průměrná doba složitosti času jsou stejné, což z něj činí efektivnější algoritmus. Funguje to rychleji než jiné techniky třídění. Sloučit řazení lze použít na soubory libovolné velikosti. Je vysoce paralelizovatelný díky použití metody dělení a dobytí. Chcete-li vyvinout silné základy v oblasti informatiky, doporučujeme vám důkladně porozumět různým třídicím algoritmům.
Doporučené články
Toto je průvodce slučováním třídění algoritmů v Javě. Zde diskutujeme implementaci sloučení třídění algoritmů v javě a algoritmy a pseudokód s příkladem. Můžete také projít naše další doporučené články -
- Výběr Seřadit v Javě
- Case Case v Javě
- Přístup k modifikátorům v Javě
- Sloučit Seřadit v JavaScriptu
- Co je to Case Case v JavaScriptu?
- Přístup modifikátory v PHP
- Algoritmy rychlého třídění v Javě
- Kompletní průvodce tříděním v C # s příklady
- Funkce třídění v Pythonu s příklady
- Top 6 algoritmů třídění v JavaScriptu