Двоичная куча - это особая куча. Двоичная куча - это полное двоичное дерево (двоичное дерево) или приблизительно полное двоичное дерево (двоичное дерево). Существует два типа двоичных кучей: самая большая куча и самая маленькая куча. Максимальная куча: значение ключа родительского узла всегда больше или равно значению ключа любого дочернего узла; Минимальная куча: значение ключа родительского узла всегда меньше или равно значению ключа любого дочернего узла.
Печать двоичная куча: Используйте иерархические отношения
Здесь я сначала сортирую кучу, а затем выполняю метод для печати кучи в сортировке printAsTree()
Общедоступный класс Maxheap <T расширяет сопоставимо <? Super t >> {private t [] data; частный размер Int; частная емкость; public maxheap (int емкость) {this.capacity = емкость; this.size = 0; this.data = (t []) новый сопоставимый [емкость + 1]; } public maxHeap (t [] arr) {// heApify, емкость кучи массива = arr.length; data = (t []) новый сопоставимый [емкость + 1]; System.ArrayCopy (ARR, 0, DATA, 1, ARR.Length); size = arr.length; для (int i = size / 2; i> = 1; i--) {shiftdown (i); }} public int size () {return this.size; } public int getCapacity () {return this.capacity; } public boolean isempty () {return size == 0; } public t eeksmax () {return data [1]; } public void swap (int i, int j) {if (i! = j) {t temp = data [i]; data [i] = data [j]; data [j] = temp; }} public void insert (t item) {size ++; data [size] = item; Shiftup (размер); } public t popmax () {swap (1, size--); ShiftDown (1); вернуть данные [размер + 1]; } public void shiftup (int child) {while (gild> 1 && data [child] .compareto (data [child / 2])> 0) {swap (child, child / 2); ребенок /= 2; }}/*** @param Нижний угол отметки элемента в массиве данных* @param b Нижний угловой отметок элемента в массиве данных* @return return, какой элемент больше, нижняя отметка, в котором элемент больше,*/private int max (int a, int b) {if (data [a] .cpareto (data [b]) <0) {//if data b] grate b; ДАННЫЕ [a] Большой возврат a; // return a}}/*** @param Нижний угловой отметок элемента в массиве данных* @param b Нижний угол отметки элемента в массиве данных* @param c нижний угол отметки элемента в массиве данных* @return. Нижний угол, который элемент больше*/private int max (int a, int b, int c) {int max (at, a, int, max = max = max = max a, a, int, a, int, a, at, a); Самый большой = макс (самый большой, c); вернуть самое большое; } public void shiftdown (int hade) {while (true) {int lChild = отец * 2; int rchild = отец * 2 + 1; int newfather = отец; // не имеет значения, назначено ли назначение здесь. Если следующее возвращение изменяется на разрыв, он должен быть назначен, если (LCHILD> size) {// Если нет левых и правых детей, возвращающихся; } else if (rchild> size) {// Если нет правильного ребенка newfather = max (отец, lChild); } else {// Если есть левый и правый дети, newfather = max (отец, lchild, rchild); } if (newfather == Отец) {// Если исходный родительский узел является самым большим из трех, вам не нужно продолжать разбираться в возврате кучи; } else {// родительский узел не является самым большим, поменяйте детей старшего возраста и продолжает регулировать вниз, пока большая корневая куча не будет удовлетворена обменом (Newfather, отец); отец = newfather; // эквивалент Shiftdown (Newfather). Если Newfather оказывается левым ребенком отца, это эквивалентно Shiftdown (2*отец)}}} Public Static <T Extens сопоставимо <? Super t >> void sort (t [] arr) {int len = arr.length; Maxheap <t> maxheap = new maxheap <> (arr); maxheap.printastree (); for (int i = len-1; i> = 0; i--) {arr [i] = maxheap.popmax (); }} public static void prantarr (Object [] arr) {for (Object o: arr) {System.out.print (o); System.out.print ("/T"); } System.out.println (); } public void printspace (int n) {// print n spaces (используется с '/t' здесь вместо) для (int i = 0; i <n; i ++) {System.out.printf ("%3s", ""); }} public void printaStree () {int linenum = 1; // Сначала пройти первую строку int lines = (int) (math.log (size)/math.log (2)) + 1; // lines - количество слоев кучи int spacenum = (int) (Math.pow (2, lines) - 1); Для (int i = 1; i <= size;) {// Потому что данные хранятся в левом и правом закрытом интервале в [1 ... size], данные [0] не хранят данные // каждый слой печатает этот интервал [2^(номер 1) ... (2^Номер слоя) -1]. Если число в куче недостаточно (2^ слои) -1, распечатайте по размеру. Так что возьмите мин ((2^ слоев) -1, размер). for (int j = (int) math.pow (2, linenum - 1); j <= math.min (size, (int) math.pow (2, linenum) - 1); j ++) {printspace (Spacenum); // Печать пространств с Spacenum System.out.printf («%3s», Data [j]); // print Data System.out.printf ("%3s", ""); // зеленая коробка в Price Printspace (Spacenum); // Печать пространства с Spacenum i ++; // каждый элемент печатается, это+1} Linenum ++; Spacenum = Spacenum / 2; System.out.println (); }} public static void main (string args []) {integer [] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6, 1, 3, 6, 1, 1}; сортировка (arr); }}Результаты исполнения:
Суммировать
Выше приведено все содержание этой статьи о обмене кодом печати языка Java, который реализует двоичные кучи. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!