이진 힙은 특별한 힙입니다. 이진 힙은 완전한 이진 트리 (이진 트리) 또는 대략 완전한 이진 트리 (이진 트리)입니다. 이진 힙에는 두 가지 유형의 이진 힙이 있습니다 : 가장 큰 힙과 가장 작은 힙. 최대 힙 : 상위 노드의 키 값은 항상 하위 노드의 키 값보다 크거나 동일합니다. 최소 힙 : 상위 노드의 키 값은 항상 하위 노드의 키 값보다 작거나 동일합니다.
이진 힙을 인쇄 : 계층 적 관계를 활용하십시오
여기서 먼저 힙을 정렬 한 다음 깔기 printAsTree() 에 힙을 인쇄하는 방법을 실행합니다.
공개 클래스 MaxHeap <t는 비슷한 <? 슈퍼 t >> {private t [] 데이터; 개인 INT 크기; 개인 INT 용량; public maxHeap (int capacity) {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); 크기 = arr.length; for (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 seekMax () {반환 데이터 [1]; } public void swap (int i, int j) {if (i! = j) {t temp = data [i]; 데이터 [i] = 데이터 [j]; 데이터 [j] = 온도; }} public void insert (t item) {size ++; 데이터 [size] = 항목; Shiftup (크기); } public t popmax () {스왑 (1, size-); 시프트 다운 (1); 반환 데이터 [size + 1]; } public void shiftup (int child) {while (child> 1 && data [child] .compareto (data [child / 2])> 0) {swap (child, child / 2); 자식 /= 2; }}/*** @param 데이터 배열에서 요소의 하단 코너 마크* @param b 데이터 배열에서 요소의 하단 코너 마크 @return 요소가 더 큽니다. 요소의 하단 모서리 마크가 더 큽니다*/private int max (int a, int b) {if (data [a] .compareto (data [b]) <0) {// retain b} 데이터 [a] 큰 반환 a; // return a}}/*** @param 데이터 배열에서 요소의 하단 모서리 마크* @param b 데이터 배열의 요소의 하단 모서리 마크 데이터 배열의 요소의 하단 모서리 마크* @ @int max (int a, int c) {int a, int c) {int b, int c). 가장 큰 = 최대 (가장 큰, c); 가장 큰 반환; } public void shiftdown (int father) {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 == 아버지) {// 원래 상위 노드가 3 개 중 가장 큰 경우 더미 반환을 계속 정리할 필요가 없습니다. } else {// 상위 노드는 가장 크지 않으며, 나이가 많은 어린이를 교환하고 큰 루트 힙이 스왑이 만족 될 때까지 아래쪽으로 계속 조정합니다 (Newfather, Father); 아버지 = Newfather; // Shift Down (Newfather)에 해당합니다. 뉴 파트가 아버지의 좌파 자녀로 판명되면, 교대 (2*아버지)}}} public static <t는 비슷한 <? 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 printarr (object [] arr) {for (object o : arr) {system.out.print (o); System.out.print ( "/t"); } system.out.println (); } public void printspace (int n) {// n 공백 (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; // 라인은 heap int spacenum = (int) (int) (math.pow (2, lines) -1)의 층 수입니다. for (int i = 1; i <= size;) {// 데이터는 [1 ... size]에서 왼쪽 및 오른쪽 폐쇄 간격으로 저장되므로 데이터 [0]은 데이터를 저장하지 않습니다. 힙의 숫자가 충분하지 않은 경우 (2^ 층) -1, 크기로 인쇄하십시오. 따라서 최소 ((2^ 레이어) -1, 크기)를 가져갑니다. for (int j = (int) math.pow (2, linenum -1); j <= math.min (size, (int) math.pow (2, linenum) -1); // spacenum system.out.printf ( "%3s", data [j])로 공백을 인쇄합니다. // print data system.out.printf ( "%3s", ""); // 사진 인쇄 공간 (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 언어의 인쇄 코드 공유에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!