Introduzione agli algoritmi di ordinamento in Java
Ordinare le informazioni in un certo ordine, spesso all'interno di un framework simile ad un array, significa organizzarle. È possibile utilizzare requisiti di sequenza diversi, quelli più diffusi sono l'ordinamento di numeri dal minimo al maggiore o viceversa o l'ordinamento lessicografico di stringhe. Tratteremo algoritmi diversi, da alternative inefficaci ma intuitive a algoritmi efficienti implementati in modo efficace in Java e in altre lingue se siete interessati a come deve funzionare l'ordinamento.
Diversi algoritmi di ordinamento in Java
Esistono diversi algoritmi di ordinamento e non tutti sono ugualmente efficaci. Per confrontarli e vedere quali funzionano meglio, analizzeremo le loro complessità temporali.
- Ordinamento inserzione
- Bubble Sort
- Ordinamento selezione
- Unisci ordinamento
- heapsort
1. Ordinamento inserzione
Il concetto alla base di Insertion Sort divide l'intervallo in sottoarray che sono ordinati e non ordinati. La parte classificata è all'inizio della durata 1 e corrisponde al primo componente (lato sinistro) dell'array. Passiamo attraverso l'array ed espandiamo la parte classificata dell'array di un componente durante ogni iterazione. Quando espandiamo, posizioniamo l'elemento nuovo nell'array secondario ordinato. Lo facciamo spostando tutti gli elementi a destra fino a quando non troviamo che non dobbiamo cambiare il primo componente. Quando la parte in grassetto viene ordinata in ordine crescente, ad esempio, nel seguente array, si verifica:
- 3 5 7 8 4 2 1 9 6: considera 4 e inserendo questo è ciò di cui abbiamo bisogno. Stiamo cambiando da 8> 4
- 2. 3 5 7 x 8 2 1 9 6
- 3 5 x 7 8 2 1 9 6
- 3 x 5 7 8 2 1 9 6
- 3 4 5 7 8 2 1 9 6
Codice:
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+" ");
)
)
)
Produzione:
Seguendo questo metodo, un componente ha esteso la parte ordinata, ora abbiamo cinque anziché quattro elementi. Ogni iterazione fa questo e l'intero array verrà ordinato alla fine.
Nota: questo perché abbiamo bisogno di trasferire l'intero elenco classificato uno per uno in ogni iterazione, che è O (n). Per ogni componente di ogni tabella, dobbiamo farlo, il che implica che è O (n 2) limitato.2. Ordinamento bolle
Se la bolla non è nell'ordine richiesto, funziona sostituendo i componenti vicini. Questo viene ripetuto fino a quando tutti i componenti non sono in ordine dall'inizio dell'array. Sappiamo che se riusciamo a eseguire l'intera iterazione senza swap, tutti gli elementi rispetto ai loro elementi adiacenti erano nell'ordine desiderabile e, per estensione, l'intero array. Il motivo dell'algoritmo Bubble Sort è che i numeri come "bolle" nel "terreno". Se, dopo un determinato importo, si passa nuovamente all'istanza (4 è una buona istanza), si noterà che il numero lentamente si sposta a destra.
I passaggi per l'ordinamento delle bolle sono i seguenti:
- 4 2 1 5 3: qui, i primi due numeri non sono nell'ordine giusto, quindi dobbiamo ordinare entrambi i numeri.
- 2 4 1 5 3: Dopodiché, anche la prossima coppia di numeri non è nell'ordine giusto. Quindi l'ordinamento si verifica nuovamente.
- 2 1 4 5 3: questi due sono nell'ordine giusto, 4 <5, quindi non è necessario scambiarli.
- 2 1 4 5 3 : Ancora una volta dobbiamo scambiare l'ordine corretto.
- 2 1 4 3 5: ecco l'array risultante dopo una iterazione.
- Dobbiamo ripetere nuovamente questo processo fino a quando i numeri non sono nell'ordine corretto.
Codice:
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) + " ");
)
)
)
Produzione:
3. Selezione ordinamento
Selezione ordinamento suddivide la matrice in una matrice di classificazioni che non sono ordinate. Questa volta, tuttavia, il subarray di ordinamento viene formato inserendo alla fine dell'array ordinato l'elemento minimo del subarray non ordinato, scambiando:
- 3 5 1 2 4
- 1 5 3 2 4
- 1 2 3 5 4
- 1 2 3 5 4
- 1 2 3 4 5
- 1 2 3 4 5
Codice:
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+" ");
)
)
)
Produzione:
4. Unisci ordinamento
Unisci ordinamento utilizza la ricorsione per risolvere il problema del metodo di divisione e conquista in modo più efficace rispetto agli algoritmi precedentemente descritti.
Questo albero mostra come funzionano le chiamate ricorsive. Le matrici contrassegnate con la freccia verso il basso sono le matrici per le quali chiamiamo funzione mentre fondiamo le matrici con le frecce. Quindi segui la freccia sul bordo dell'albero e poi ritorna e unisci. Abbiamo un intervallo di 3 5 3 1, quindi lo dividiamo in 3 5 4 e 2 1. Li dividiamo nelle loro parti per ordinarli. Iniziamo a fonderli e selezionarli mentre procediamo verso il fondo.
Codice:
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));
)
)
In questo programma, abbiamo chiesto all'utente di inserire l'input. L'output sarà in ordine ordinato in base all'input dell'utente.
Produzione:
5. Ordinamento dell'heap
Devi prima conoscere il framework su cui opera Heapsort, l'heap, per capire perché funziona. Parleremo in particolare di un heap binario, ma puoi anche generalizzare questo ad altre costruzioni di heap. Un heap è un albero che soddisfa le proprietà dell'heap, vale a dire che tutti i suoi figli hanno relazioni con ciascun nodo. Anche un mucchio deve essere quasi finito. Un binario d-depth quasi completo ha una sottostruttura d-1, con la stessa radice, e ogni nodo ha una sottostruttura piena, sinistra, con una sinistra discendente.
In altre parole, si ottiene un numero sempre più basso (min-heap) o più grande e più grande (max-heap) quando ci si sposta giù dall'albero. Ecco un'istanza max-heap:
- 6 1 8 3 5 2 4 : Qui, entrambi i numeri dei bambini sono più piccoli del genitore, quindi non dobbiamo cambiare nulla.
- 6 1 8 3 5 2 4: Qui, 5> 1, dobbiamo scambiarli. Dobbiamo ammassarci per 5.
- 6 5 8 3 1 2 4: entrambi i numeri dei bambini sono più piccoli, tutto rimane uguale.
- 6 5 8 3 1 2 4: qui, 8> 6, quindi dovremmo scambiarli.
- 8 5 6 3 1 2 4: Dopo questa iterazione, otterremo questo risultato.
Dopo aver ripetuto questo processo, avremo i seguenti risultati:
- 8 5 6 3 1 2 4
- 4 5 6 3 1 2 8 : Scambio
- 6 5 4 3 1 2 8 : Heapify
- 2 5 4 3 1 6 8 : Scambio
- 5 2 4 2 1 6 8 : Heapify
- 1 2 4 2 5 6 8 : scambio
Codice:
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);
)
)
Produzione:
Puoi vederlo da un punto all'altro del grafico, da sinistra a destra. Ciò che abbiamo ottenuto qui è che quando abbiamo il componente kth nell'array, la posizione dei suoi figli è 2 \ * k + 1 e 2 \ * k + 2 (supponendo che l'indicizzazione inizi da 0). Questo può essere monitorato da te. La posizione del genitore è sempre (k-1) / 2 per il componente kth. Puoi prontamente "ammassare al massimo" qualsiasi intervallo, perché lo sai. Controlla se uno dei suoi figli è inferiore a quello di ciascun componente. In tal caso, associare un genitore e ripetere questo passaggio in modo ricorsivo con il genitore.
Nota: poiché iterando i cicli for nell'intero array rende heapSort) (ovviamente O (N), creerebbe la complessità complessiva di Heapsort O (nlog n). Heapsort ha un tipo sul posto, il che significa che richiede O ( 1) più spazio di Merge Sort, ma presenta alcuni svantaggi, come i parallelismi che sono difficili.Conclusione - Ordinamento degli algoritmi in Java
L'ordinamento è una procedura molto diffusa con set di dati, sia per ulteriori analisi, che accelera la ricerca con algoritmi più efficaci basandosi su informazioni ordinate, filtrando informazioni, ecc. L'ordinamento è approvato da diverse lingue e spesso le interfacce oscurano ciò che fa il programmatore.
Articoli consigliati
Questa è una guida per ordinare gli algoritmi in Java. Qui discutiamo diversi tipi di ordinamento in Java insieme ai loro algoritmi. Puoi anche consultare i nostri altri articoli suggeriti:
- Unisci gli algoritmi di ordinamento in Java
- JComboBox in Java
- StringBuffer in Java
- JTextField in Java
- Ordinamento dell'heap in Python
- Algoritmi di ordinamento rapido in Java
- Guida completa all'ordinamento in C # con esempi
- Ordinamento degli algoritmi in JavaScript
- Guida agli esempi di algoritmo C ++
- Guida completa all'ordinamento degli algoritmi in Python