Die Heapsort-Algorithmus ist eine der am schnellsten Sortieralgorithmen verfügbar . Programmierer verwenden heapsort in Java , weil es eine gute Wahl für sehr große Arrays sie wissen, um in einer unsortierten Zustand ist . Aus Gründen der Effizienz willen, ist eine tatsächliche Baumstruktur nicht verwendet. Stattdessen wird der Baum an Ort und Stelle gebildet , direkt im Array. Die Heapsort-Algorithmus ist ein " in place" -Algorithmus , da es keinen zusätzlichen Speicher, um die Sortierung durchzuführen erfordert . Anleitung
1
Arrangieren Sie die Swap -Methode. Dieser tauscht zwei Elemente eines Arrays " " public static void swap ( int [ ] a, int i, int j) {int tmp = a [ j] ; . A [ j] = a [ i] ; a [i] = tmp ; } ""
2
schreiben Sie den Kern des Algorithmus , der siftDown Verfahren . Es ist sowohl Form dem Heap -Struktur verwendet und die eigentliche Art .
3
Sieben große Werte in Richtung der Wurzel des Baumes und kleine Werte auf den Blättern mit der siftDown Verfahren . Da diese Methode mehrere Male während der Sortierung aufgerufen wird, wird der größte Knoten konsequent auf den Root-Knoten gesiebt und zog bis zum Ende des Arrays. Jeder Knoten hat n bis zu zwei Kinder, deren Indizes n * 2 + 1 und n * 2 + 2 . " " public static void siftDown ( int [ ] a, int Start , int end) {int root = starten , während (root * 2 + 1 Kind = int root * 2 + 1; //Wenn das Kind ein Geschwister und die Kindes -Wert kleiner als seine Geschwister if ( child child + +; } if (a [root ] swap ( a, Wurzel, Kind) ; root = Kind ; } else {return ;}} } ""
4 < p> mit dem heapify Verfahren . Dieses Verfahren am Anfang von der Art , um die anfängliche Heap -Struktur zu erstellen wird aufgerufen. Dieser ist schnell gemacht, da der Heap -Struktur ist etwas vage . die einzige Voraussetzung ist, dass jede Wurzel Knoten muss größer sein als die untergeordnete Knoten " " public static void heapify ( int [ ] a) {for (int start = a.length /2 - 1; start> = 0; starten - ) . siftDown (a , start, a.length -1 ); } ""
5
schreiben Sie die HeapSort Methode die Methode zuerst heapifies das Array für die Art vorzubereiten siftDown die Methode wird dann wieder seit der Root-Knoten ist nun ein kleiner Wert genannt This. . . siebt einen neuen großen Wert auf den root-Knoten , und der gesamte Prozess wird wiederholt, bis die Größe des Heap ist eine " " public static void Heapsort ( int [ ] a) { heapify (a); . for (int end = ein . Länge - 1; Ende > 1 ; Ende - ) {swap (a, Ende , 0); siftDown (a , 0, Ende - 1 );} } ""
6
-Test . HeapSort das Verfahren das folgende Beispiel zeigt ein kleines Testprogramm " " 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 ("Vor dem sortieren :"); for (int i = 0; i HeapSort (a); System.out.println (" nach der Sortierung "); for (int i = 0; i } ""