Ordinamento di elenchi di dati presenta uno dei problemi più difficili per i programmatori di computer , perché è difficile da concettualizzare e implementare algoritmi di ordinamento efficienti nei linguaggi di programmazione . Ordinamento richiede notevoli copia, spostamento e la lettura di dati da lavorare . Di conseguenza , i programmatori si concentrano sullo sviluppo di algoritmi di ordinamento efficienti e generici . Uno di questi, il merge sort , funziona dividendo un elenco di valori più e più volte in modo ricorsivo di "divide et impera " il problema . Dal merge sort è inteso come una soluzione generica , la maggior parte delle lingue, tra cui Java , hanno modi per attuarla. Unisci Classe
merge sort prende una lista da ordinare e divide ricorsivamente la lista fino a raggiungere i valori singoli , come i numeri singoli. Il tipo poi ricombina i numeri in modo ordinato , infine restituire un elenco ordinato . Una classe di ordinamento di base in Java conterrà un elenco di specie , e chiamare una funzione principale unire ordinamento definisce :
classe
Merge {
public int [ ] x ;
public static void main ( String [] args ) {
x = [ 5 , 6 , 3 , 4 , 7 , 8 , 10 , 2 ] ;
mergeSort ( x , 0 , x . lunghezza - 1) ;
}}
merge sort funzione
al di fuori della classe principale risiederà una funzione merge sort . Questi segmenti funzione una serie di numeri per ordinare nella lista. Inizialmente , questa gamma rappresenterà l'intera lista , ma come il merge sort continua , ci vorranno solo metà della lista fino a raggiungere le voci singole . Quindi , la funzione di ordinamento merge ricombinare gli elementi in elenchi di grandi dimensioni che sono ordinati (Fonte 2) :
public void mergeSort ( int basso , int hi ) {
se (basso < ciao ) { int media = ( basso + hi ) /2; mergeSort ( bassa, media ) ; mergeSort ( metà + 1 , hi ) ; merge ( bassa, media , alta );} }
di base merge funzione
La funzione di unione unirà due liste dopo di loro ordinamento . Se la funzione riceve singoli elementi , che ordinerà loro. In caso contrario , ci vorranno due liste separate , e in base al desiderio del loro in ordine crescente o decrescente per programmatore :
private void merge ( int low, mid int, int hi ) {
< p > int [ ] copia = new int [ x.length - 1 ] ;
//Copia entrambe le parti nella matrice di supporto for (int i = basso ; i < = hi , i + + ) { copia [i ] = x [ i] ; }
int i = basso ; int j = metà + 1 ; int k = basso ; while ( i < = metà && j < = hi ) {if (copia [ i] < = copia [ j ] ) { x [ k] = copia [ i] ; i + + ; } else { x [ k] = copia [ j ] ; j + + ; } k + + ; } //Copia il resto del lato sinistro della matrice nella matrice di destinazione ( i < = centro ), mentre { x [ k] = copia [ i] ; k + + ; i + + ; }
}
< br > Merge Sort Recurse
la funzione " mergeSort " divide ricorsivamente la lista . In primo luogo , si suddivide la lista originale a metà per ogni volta che si richiama sé stesso ricorsivamente . Quando la ricorsione raggiunge una sola cifra , la funzione quindi marcia indietro e comincia a ordinare la lista . Ogni volta che la funzione marcia indietro a una precedente chiamata di funzione , si fonde due metà di una lista più piccola , alla fine di lavoro torna alla lista completa . La funzione " Merge" sembra fare il lavoro pesante organizzando e copiando i valori nella lista , ma il cuore di un merge sort è in funzione apparentemente semplice " mergeSort " .
< Br >