Den heapsort algoritme er en af de hurtigste sortering algoritmer til rådighed. Programmører bruger heapsort i Java , fordi det er et godt valg til meget store arrays , de kender til at være i en usorteret tilstand. For effektivitetens skyld , er et virkeligt træstruktur ikke anvendes . I stedet bliver træet dannet på plads , lige i array. Den heapsort algoritme er et " på plads " algoritme , da det kræver ingen ekstra hukommelse til at udføre den slags . Instruktioner
1
Komponer swap metoden. Dette vil bytte to elementer i et array "" public static void swap ( int [ ] a, int i , int j ) { int tmp = a [j ] . A [ j] = a [i ], en [i] = tmp ;} ""
2
Skriv kernen i den algoritme , at siftDown metoden. Det bruges til både form den bunke struktur og gøre det egentlige slags.
3
Sigt store værdier mod roden af træet og små værdier mod bladene med siftDown metoden. Da denne metode kaldes flere gange i løbet af sorteringen proces er den største knudepunkt konsekvent sigtet til rodknuden og flyttes til enden af matrixen. Enhver node n har op til to børn, hvis indekser er n * 2 + 1 og n * 2 + 2 . "" public static void siftDown ( int [ ] a , int start, int ende) { int root = start , mens (root * 2 + 1 int barn = rod * 2 + 1 //Hvis barnet har en søskende , og barns værdi er mindre end sin bror og søster , hvis ( barn barn + + ;} if ( a [root ] swap (a, rod, barn ), root = barn, } else {return ;} }} ""
4 < p > Brug heapify metoden . Denne metode kaldes ved begyndelsen af den slags til at skabe den første bunke struktur . Dette gøres hurtigt , da bunke struktur er noget vag . det eneste krav er, at hver rodnode skal være større end den barn noder "" public static void heapify ( int [ ] a ) { for (int start = a.length /2 - 1 , start> = 0; start - ) . siftDown (a, start, a.length -1 );} ""
5
Skriv heapSort metoden metoden først heapifies array til at forberede den slags den siftDown metoden kaldes da igen, da roden node er nu en lille værdi Dette . . . sorterer en ny stor værdi til rodknuden , og hele processen gentages , indtil størrelsen af bunken er en "" public static void heapSort ( int [ ] a ) { heapify ( a). for (int ende = en . længde - 1 , end > 1 , ultimo - ) { swap (a, ende , 0) ; siftDown (a, 0, ultimo - 1) ;}} ""
6
Test . den heapSort metoden følgende eksempel viser et lille testprogram "" public static void main ( String [] args ) { int [ ] a = new int [10] . for (int i = 0; i for ( int i = 0 , jeg swap (a, i, i + ( int) ( Math.random () * ( 9 - i)) ), System.out.println ( "Før sortering :"); for (int i = 0; jeg heapSort ( a) System.out.println ( "Efter sortering ") for (int i = 0; i} ""