L'algoritmo heapsort è uno dei più veloci algoritmi di ordinamento disponibili . I programmatori usano heapsort in Java , perché è una buona scelta per grandi schiere che sanno di essere in uno stato indifferenziato. Per ragioni di efficienza , un albero effettivo non è utilizzato . Invece , l'albero è formato in posto , proprio nella matrice. L'algoritmo heapsort è " a posto " algoritmo , in quanto non richiede ulteriore memoria per eseguire l'ordinamento . Istruzioni
1
Compose il metodo swap. Ciò scambiare due elementi di un array " " public static di swap void ( int [] a , int i , int j ) { int tmp = a [ j ] ; . A [ j ] = a [i] , a [i] = tmp ; } " "
2
Scrivi il nucleo dell'algoritmo , il metodo siftDown . E 'utilizzato sia per forma la struttura heap e fare il tipo effettivo .
3
Setacciate valori di grandi dimensioni verso la radice dell'albero e piccoli valori verso le foglie con il metodo siftDown . Poiché questo metodo viene chiamato più volte durante il processo di sequenziazione , la più grande nodo è costantemente setacciata al nodo radice e spostato alla fine della matrice . Ogni nodo n ha fino a due bambini, i cui indici sono n * 2 + 1 e n * 2 + 2 . " " statica siftDown public void ( int [] a , int start , int end) { int root = inizio ; mentre (radice * 2 + 1 bambino int = radice * 2 + 1 ; //Se il bambino ha un fratello e la valore del bambino è inferiore a suo fratello se ( figlio bambino + +; } if ( uno swap [root ] (a, radice , bambino) ; root = bambino ; } else { return; } } } " "
4 < p > Utilizzare il metodo heapify . Questo metodo viene chiamata all'inizio del genere per creare la struttura iniziale mucchio. Ciò è fatto rapidamente , poiché la struttura heap è alquanto vago . l' unico requisito è che ogni nodo radice deve essere maggiore della nodi figli " " public static void heapify ( int [ ] a) {for ( int start = a.length /2 - 1; inizio > = 0; iniziare - ) . siftDown (a, inizio, a.length - 1 );} " "
5
Scrivi il metodo heapsort il metodo heapifies prima l'array di prepararsi per l'ordinamento il metodo siftDown viene poi chiamato di nuovo in quanto il nodo principale è oggi un piccolo valore di questa . . . setaccia un nuovo grande valore per il nodo radice , e l'intero processo viene ripetuto fino a quando la dimensione dello heap è una " " public static void heapsort ( int [ ] a) { heapify ( a); . for (int fine = a . lunghezza - 1 ; end > 1; end - ) { swap ( a, fine , 0); siftDown (a, 0 , fine - 1 );} } " "
6
test . del metodo heapsort l'esempio seguente mostra un piccolo programma di test " " public static void main ( String [] args ) { int [ ] a = new int [10]; . for (int i = 0; i for (int i = 0 , i swap ( a, i, i + ( int ) ( Math.random ( ) * ( 9 - i) ) ) ; System.out.println (" Prima di ordinamento :"); for (int i = 0 ; i heapsort ( a); System.out.println ( " Dopo la cernita "); for (int i = 0; i} " "