Uvod u sortiranje algoritama na Javi

Poredati podatke po određenom redoslijedu, često unutar okvira sličnog nizu, znači organizirati ih. Možete koristiti različite zahtjeve za redoslijedom, a popularni su razvrstavanje brojeva od najmanje do najvećeg ili obrnuto ili leksikografski sortiranje nizova. Obuhvatit ćemo različite algoritme, od neučinkovitih, ali intuitivnih alternativa do učinkovitih algoritama koji se učinkovito implementiraju u Javi i na drugim jezicima ako vas zanima kako sortiranje funkcionira.

Različiti algoritmi sortiranja u Javi

Postoje različiti algoritmi sortiranja i nisu svi podjednako učinkoviti. Da bismo ih usporedili i vidjeli koji od njih imaju najbolju analizu, analizirat ćemo njihove vremenske složenosti.

  1. Poredak umetanja
  2. Razvrstavanje mjehurića
  3. Izbor sortiranja
  4. Spajanje sortiranja
  5. Heapsort

1. Umetanje vrsta

Koncept koji stoji iza umetanja raspona dijeli raspon na podrasle koji su sortirani i nesortirani. Razvrstani dio nalazi se na početku trajanja 1 i podudara se s prvom (lijevom bočnom) komponentom u nizu. Prelazimo kroz niz i proširujemo klasificirani dio matrice za jednu komponentu tijekom svake iteracije. Kad se proširimo, svježi element postavljamo u razvrstani pod-niz. To radimo pomicanjem svih elemenata udesno dok ne ustanovimo da ne moramo mijenjati prvu komponentu. Kada je podebljani dio sortiran uzlaznim redoslijedom, na primjer, u sljedećem nizu:

  1. 3 5 7 8 4 2 1 9 6: Razmotrite 4 i ovo je ono što trebamo umetnuti. Smjenjujemo se od 8> 4
  2. 2. 3 5 7 x 8 2 1 9 6
  3. 3 5 x 7 8 2 1 9 6
  4. 3 x 5 7 8 2 1 9 6
  5. 3 4 5 7 8 2 1 9 6

Kodirati:

public class InsertionSortEx (
public static void insertionSort(int() arr) (
for (int x = 1; x < arr.length; x++) (
int current = arr(x);
int y = x - 1;
while(y >= 0 && current < arr(y)) (
arr(y+1) = arr(y);
y--;
)
arr(y+1) = current;
)
)
public static void main(String a())(
int() arr1 = (3, 5, 7, 8, 4, 2, 1, 9, 6);
System.out.println("Before Sorting");
for(int x:arr1)(
System.out.print(x+" ");
)
System.out.println();
insertionSort(arr1);//sorting array using insertion sort
System.out.println("After Insertion Sorting");
for(int x:arr1)(
System.out.print(x+" ");
)
)
)

Izlaz:

Nakon ove metode, jedna je komponenta proširila sortirani dio, sada imamo pet umjesto četiri elementa. Svaka iteracija to učini i cijeli će niz biti poredan do kraja.

Napomena: To je zato što moramo čitav popis klasificiranih, po jedan prenositi u svakoj iteraciji, što je O (n). Za svaku komponentu svake tablice to moramo učiniti, što znači da je O (n 2) ograničen.2.

2. Bubble Sort

Ako mjehurić nije u željenom redoslijedu, on djeluje zamjenom susjednih komponenti. To se ponavlja sve dok sve komponente ne budu u redu od početka niza. Znamo da ako uspijemo izvršiti cijelu iteraciju bez zamjene, sve stavke u usporedbi s njihovim susjednim elementima bile su u željenom redoslijedu i, produžetak, čitavom nizu. Razlog algoritma Razvrstavanje mjehurića je taj što brojevi poput "balončići gore" prelaze u "zemlju". Ako nakon određenog iznosa ponovo prođete kroz instancu (4 je dobra instanca), primijetit ćete da se broj polako pomiče se udesno.

Koraci za sortiranje mjehurića su sljedeći:

  1. 4 2 1 5 3: Ovdje, prva dva broja nisu u ispravnom redoslijedu, stoga moramo sortirati oba broja.
  2. 2 4 1 5 3: Nakon toga, slijedeći par također nije u pravom redoslijedu. Dakle, sortiranje se događa opet.
  3. 2 1 4 5 3: Ovo dvoje je u ispravnom redoslijedu, 4 <5, stoga ih nema potrebe mijenjati.
  4. 2 1 4 5 3 : Opet moramo zamijeniti pravilan redoslijed.
  5. 2 1 4 3 5: Evo rezultirajućeg niza nakon jedne ponavljanja.
  6. Opet moramo ponoviti taj postupak sve dok brojevi ne budu u redu.

Kodirati:

public class BubbleSortExample (
public static void bubbleSort(int() arr) (
int n = arr.length;
int tmp = 0;
for(int x=0; x < n; x++)(
for(int y=1; y < (nx); y++)(
if(arr(y-1) > arr(y))(
//swap elements
tmp = arr(y-1);
arr(y-1) = arr(y);
arr(y) = tmp;
)
)
)
)
public static void main(String() args) (
int arr() =(4, 2, 1, 5, 3);
System.out.println("Array Before Bubble Sort");
for(int x=0; x < arr.length; x++)(
System.out.print(arr(x) + " ");
)
System.out.println();
bubbleSort(arr);
System.out.println("Array After Bubble Sort");
for(int x=0; x < arr.length; x++)(
System.out.print(arr(x) + " ");
)
)
)

Izlaz:

Napomena: Mogla bi završiti u beskonačnom petlji ako upotrijebim (i)> = a (i + 1), jer bi ta veza i dalje bila valjana s ekvivalentnim komponentama i tako ih uvijek mijenjala iz jednog u drugi element.

3. Izbor sortiranja

Selection Sort dijeli niz na niz klasifikacija koje nisu sortirane. Ovoga puta, međutim, podred sortiranja nastaje umetanjem na kraj sortirane matrice minimalni element nesortiranog podrasla, zamjenom:

  1. 3 5 1 2 4
  2. 1 5 3 2 4
  3. 1 2 3 5 4
  4. 1 2 3 5 4
  5. 1 2 3 4 5
  6. 1 2 3 4 5

Kodirati:

public class SelectionSortEx (
public static void selectionSort(int() arr)(
for (int x = 0; x < arr.length - 1; x++)
(
int indx = x;
for (int y = x + 1; y < arr.length; y++)(
if (arr(y) < arr(indx))(
indx = y;
)
)
int smallNumber = arr(indx);
arr(indx) = arr(x);
arr(x) = smallNumber;
)
)
public static void main(String a())(
int() arr1 = (3, 5, 1, 2, 4);
System.out.println("Before Sorting");
for(int x:arr1)(
System.out.print(x+" ");
)
System.out.println();
selectionSort(arr1);
System.out.println("After Selection Sorting");
for(int x:arr1)(
System.out.print(x+" ");
)
)
)

Izlaz:

Napomena: Za veličinu polja najmanje je O (n), jer se moraju provjeriti sve komponente. Za svaki element matrice moramo pronaći minimum i cijeli postupak O (n 2) ograničiti.

4. Spajanje sortiranja

Spajanje sortiranja koristi rekurziju da bi riješio problem dijeljenja i osvajanja metoda učinkovitije nego ranije opisani algoritmi.

Ovo stablo pokazuje kako funkcioniraju rekurzivni pozivi. Označeni nizovi strelica prema dolje su nizovi za koje zovemo funkciju, dok osiguravamo niz strelica. Zatim slijedite strelicu do ruba stabla, a zatim se vratite i spojite. Imamo raspon 3 5 3 1, pa smo ga podijelili u 3 5 4 i 2 1. Podijelili smo ih na njihove dijelove kako bismo ih razvrstali. Počinjemo ih fugirati i razvrstavati dok krenemo kad stignemo do dna.

Kodirati:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class MergeSort (
static void merge(int() array, int lowval, int midval, int highval)(
int x, y, k;
int() c= new int(highval-lowval+1);
k = 0;
x=lowval;
y=midval+1;
while(x<=midval && y<=highval)(
if(array(x)<=array(y))(
c(k++) = array(x++);
)
else(
c(k++) = array(y++);
)
)
while(x<=midval)(
c(k++) = array(x++);
)
while(y<=highval)(
c(k++) = array(y++);
)
k=0;
for(x = lowval; x<=highval; x++)(
array(x) = c(k++);
)
)
static void mergeSort(int() array, int lowval, int highval)(
if(highval-lowval+1>1)(
int midval = (lowval+highval)/2;
mergeSort(array, lowval, midval);
mergeSort(array, midval+1, highval);
merge(array, lowval, midval, highval);
)
)
public static void main(String() args) (
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
int size;
System.out.println("Enter the array");
try (
size = Integer.parseInt(r.readLine());
) catch (Exception e) (
System.out.println("Please Enter valid Input");
return;
)
int() array = new int(size);
System.out.println("Enter array elements");
int x;
for (x = 0; x < array.length; x++) (
try (
array(x) = Integer.parseInt(r.readLine());
) catch (Exception e) (
System.out.println("An error Occurred");
)
)
System.out.println("After Sorting");
System.out.println(Arrays.toString(array));
mergeSort(array, 0, array.length-1);
System.out.println("Before Merge Sorting");
System.out.println(Arrays.toString(array));
)
)

U ovom smo programu tražili od korisnika da unese unos. Izlaz će biti sortiran na temelju korisnikovog unosa.

Izlaz:

5. Skupa hrpa

Prvo morate znati okvir na kojem Heapsort djeluje - hrpu - da biste shvatili zašto djeluje. Mi ćemo posebno govoriti o binarnoj hrpi, ali to možete i generalizirati na druge konstrukcije gomile. Kopča je stablo koje ispunjava svojstvo gomile, naime da sva njegova djeca imaju odnos prema svakom čvoru. Hrpa također mora biti gotovo gotova. Binarni uređaj za gotovo potpunu dubinu ima pod-stablo d-1, s istim korijenom, a svaki čvor ima potpuno, lijevo podređenje, s lijeve strane koja se spušta.

Drugim riječima, dobit ćete manji i manji broj (min-heap) ili veći i veći (max-heap) kada se krećete niz stablo. Evo primjera max-heap:

  1. 6 1 8 3 5 2 4 : Evo, broj obojice djece manji je od roditelja, stoga ne moramo ništa mijenjati.
  2. 6 1 8 3 5 2 4: Evo, 5> 1, moramo ih zamijeniti. Moramo pojačati za 5.
  3. 6 5 8 3 1 2 4: Oba su broja djece manja, sve ostaje isto.
  4. 6 5 8 3 1 2 4: Evo, 8> 6, stoga bismo ih trebali zamijeniti.
  5. 8 5 6 3 1 2 4: Nakon ove iteracije dobit ćemo ovaj rezultat.

Nakon ponovnog ponavljanja ovog postupka, dobit ćemo sljedeće rezultate:

  • 8 5 6 3 1 2 4
  1. 4 5 6 3 1 2 8 : Zamjena
  2. 6 5 4 3 1 2 8 : Pojačajte
  3. 2 5 4 3 1 6 8 : Zamjena
  4. 5 2 4 2 1 6 8 : Pojačajte
  5. 1 2 4 2 5 6 8 : Zamjena

Kodirati:

public class HeapSort
(
public void sort(int arr())
(
int n = arr.length;
for (int x = n / 2 - 1; x >= 0; x--)
heapify(arr, n, x);
for (int x=n-1; x>=0; x--)
int tmp = arr(0);
arr(0) = arr(x);
arr(x) = tmp;
heapify(arr, x, 0);
)
)
void heapify(int arr(), int n, int x)
(
int largest = x;
int L = 2*x + 1;
int r = 2*x + 2;
if (L arr(largest))
largest = L;
if (r arr(largest))
largest = r;
if (largest != x)
(
int swap = arr(x);
arr(x) = arr(largest);
arr(largest) = swap;
heapify(arr, n, largest);
)
)
static void printArray(int arr())
(
int n = arr.length;
for (int x=0; x System.out.print(arr(x)+" ");
System.out.println();
)
public static void main(String args())
(
int arr() = (6, 1, 8, 3, 5, 2, 4);
int n = arr.length;
System.out.println("Before Sorting:");
printArray(arr);
HeapSort ob = new HeapSort();
ob.sort(arr);
System.out.println("After Heap Sorting:");
printArray(arr);
)
)
public class HeapSort
(
public void sort(int arr())
(
int n = arr.length;
for (int x = n / 2 - 1; x >= 0; x--)
heapify(arr, n, x);
for (int x=n-1; x>=0; x--)
int tmp = arr(0);
arr(0) = arr(x);
arr(x) = tmp;
heapify(arr, x, 0);
)
)
void heapify(int arr(), int n, int x)
(
int largest = x;
int L = 2*x + 1;
int r = 2*x + 2;
if (L arr(largest))
largest = L;
if (r arr(largest))
largest = r;
if (largest != x)
(
int swap = arr(x);
arr(x) = arr(largest);
arr(largest) = swap;
heapify(arr, n, largest);
)
)
static void printArray(int arr())
(
int n = arr.length;
for (int x=0; x System.out.print(arr(x)+" ");
System.out.println();
)
public static void main(String args())
(
int arr() = (6, 1, 8, 3, 5, 2, 4);
int n = arr.length;
System.out.println("Before Sorting:");
printArray(arr);
HeapSort ob = new HeapSort();
ob.sort(arr);
System.out.println("After Heap Sorting:");
printArray(arr);
)
)

Izlaz:

Možete ga vidjeti od točke do razine grafikona, slijeva udesno. Ono što smo ovdje postigli je da kada imamo kth komponentu u nizu, položaj njene djece je 2 \ * k + 1 i 2 \ * k + 2 (pod pretpostavkom da indeksiranje počinje s 0). To možete nadzirati vi. Položaj roditelja je uvijek (k-1) / 2 za kth komponentu. Možete lako „maksimitirati“ bilo koji raspon, jer to znate. Provjerite je li jedno od njegovih klinaca niže od onog za svaku komponentu. Ako je to slučaj, uparite jedan roditelj i ponavljajte ovaj korak rekurzivno s roditeljem.

Napomena: Budući da iteriranje petlji preko cijelog niza čini heapSort) (očito O (N), to bi stvorilo ukupnu složenost Heapsort O (nlog n). Heapsort ima tip na licu mjesta, što znači da zahtijeva O ( 1) više prostora od spajanja sortiranja, ali ima neke nedostatke, poput tvrdih paralela.

Zaključak - Razvrstavanje algoritama u Javi

Razvrstavanje je vrlo rasprostranjen postupak s skupovima podataka, bilo da se radi daljnja analiza, ubrzavanje pretraživanja učinkovitijim algoritmima koji se oslanjaju na sortirane informacije, podatke o filtriranju itd. Sortiranje je podržano na više jezika, a često sučelja zatamnjuju ono što programer radi.

Preporučeni članci

Ovo je vodič za sortiranje algoritama na Javi. Ovdje ćemo raspravljati o različitim vrstama sortiranja na Javi, zajedno s njihovim algoritmima. Možete i pregledati naše druge predložene članke -

  1. Spajanje algoritam sortiranja u Javi
  2. JComboBox na Javi
  3. StringBuffer na Javi
  4. JTextField u Javi
  5. Poredajte u Python
  6. Brzo sortiranje algoritama na Javi
  7. Kompletan vodič za sortiranje u C # s primjerima
  8. Razvrstavanje algoritama u JavaScript
  9. Vodič za primjere algoritma C ++
  10. Kompletan vodič za sortiranje algoritama u Pythonu

Kategorija: