힙 분류를 배우려면 먼저 힙의 개념을 이해해야합니다. 완전히 바이너리 트리로 배열 저장 방법으로 근사 할 수 있습니다. 그러나 그와 함께 이진 분류 트리와 유사한 다른 속성이 있습니다. 가장 큰 힙과 가장 큰 힙 사이에는 루트 노드의 값이 하위 노드의 값보다 크다는 것을 의미합니다. 어린이 노드의. 힙 분류는 일반적으로 가장 큰 힙을 사용하는 반면 가장 작은 힙은 우선 순위 큐를 구성 할 수 있습니다. 힙에 힙의 특성을 유지하는 데 사용되는 방법이 있습니다. 이는 아래 코드의 MaxHeap 방법입니다 배열 및 두 번째 매개 변수는 특정 노드 위치에 대한 힙을 조정하는 것입니다.이 노드의 값은 최대 힙의 특성을 준수하지 않을 수 있으므로이 값은 매개 변수로 사용되며 크기는 실제로의 수입니다. 유효한 요소는 실제로 힙에 저장됩니다. 어쩌면 배열의 길이는 실제로 힙에 저장된 요소의 수이지만 반드시 최대 힙을 구축하는 데 필요한 모든 데이터는 아닙니다. 알고리즘 소개는 왼쪽 하위 노드가 2xi이지만 왼쪽 하위 노드는 2xi+1이됩니다 도 2는이 지점의 하위 노드가 모두 리프 노드이므로 하단에서 상단으로 정렬하여 최대 힙을 구축합니다. 힙의 모든 노드가 최대 힙 특성을 충족하는지 확인하십시오. 마지막으로, 힙 정렬은 첫 번째 노드를 꺼내어 나머지 노드를 다시 정렬 한 다음 루트 노드를 꺼내는 것입니다. 이것은 우리가 그것을 꺼낼 때마다 최대 값이되도록합니다.
코드 사본은 다음과 같습니다.
공개 클래스 heapsort {
개인 int getleft (int i) {
반환 2*i+1;
}
개인 int getright (int i) {
반환 2*i+2;
}
public void maxHeap (int [] 힙, int loc, int size) {
int l = getleft (loc);
int r = getright (loc);
int 최대 = loc;
if (l <size && heap [l]> heap [loc]) {
가장 큰 = l;
}
if (r <size && heap [r]> heap [marge]) {
가장 큰 = r;
}
if (가장 큰! = loc) {
int cache = 힙 [loc];
힙 [loc] = 힙 [가장 큰];
힙 [가장 큰] = 캐시;
MaxHeap (힙, 크기, 크기);
}
}
public void buildheap (int [] heap) {
for (int i = heap.length/2; i> = 0; i-) {
MaxHeap (Heap, I, Heap.Length);
}
}
public void sort (int [] heap) {
buildheap (힙);
for (int i = heap.length-1; i> 1; i-) {
int cache = 힙 [0];
힙 [0] = 힙 [i];
힙 [i] = 캐시;
MaxHeap (힙, 0, i);
}
int cache = 힙 [0];
힙 [0] = 힙 [1];
힙 [1] = 캐시;
}
public static void main (String [] args) {
int [] heap = new int [] {4,1,5,3,7,12,65,7};
Heapsort HS = 새로운 Heapsort ();
Hsort (힙);
for (int i = 0; i <heap.length; i ++) {
System.out.println (heap [i]);
}
}
}