Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.02 KB | None | 0 0
  1. // 우선순위 큐의 추출 POP
  2. int pop(priorityQueue *root) {
  3. if (root->count <= 0) return -9999;
  4. // 추출할 대상이 더이상 없을경우 오류를 출력
  5.  
  6. int res = root->heap[0];
  7. // 반환할 최상단 루트의 값을 res 변수에 담습니다.
  8.  
  9. root->count--;
  10. // 최산단 루트값이 하나 빠짐으로 count 값도 같이 하나 감소시킵니다.
  11.  
  12. root->heap[0] = root->heap[root->count];
  13. // 최상단 루트에는 맨 마지막 노드값이 들어가도록 합니다.
  14. // 이제 최상단 루트와 맨마지막 노드값의 위치가 변경되었으니 하양식으로 data값을
  15. // 확인해가며 최대힙을 구성해가면 됩니다.
  16.  
  17. int now = 0, leftChild = 1, rightChild = 2;
  18. // now 는 최상단 루트의 위치
  19. // leftChild 최상단 루트의 자식값의 왼쪽
  20. // rightChild 최상단 루트의 자식값의 오른쪽
  21.  
  22. int target = now;
  23.  
  24. // 새 원소를 추출한 이후에 하향식으로 힙을 구성합니다.
  25. while (leftChild < root->count) {
  26. if (root->heap[target] < root->heap[leftChild]) target = leftChild;
  27. // 현재 부모값 보다 왼쪽의 자식값이 더 크면 target 에 자식값을 참조합니다.
  28.  
  29. if (root->heap[target] < root->heap[rightChild] && rightChild < root->count) target = rightChild;
  30. // 현재 부모값 보다 외른쪽 자식값이 더 크고 rightChild index 값보다 현재 index 값이 더크면 (index 위치 벗어나지 안도록)
  31. // target 에 자식값을 참조합니다.
  32.  
  33. if (target == now) break; // 더 이상 내려가지 않아도 될 때 종료
  34. else {
  35. swap(&root->heap[now], &root->heap[target]);
  36. // 현재 값과 자식값의 자리를 바꿔준다.
  37. now = target;
  38. // 다음 트리 검사대상을 now에 참조시킵니다.
  39. // 그러면 트리를 하양식으로 내려가면서 검사를 계속해서 반복합니다.
  40. leftChild = now * 2 + 1;
  41. rightChild = now * 2 + 2;
  42. // 자식값 index 또한 다음 index 트리로 이동시켜줍니다.
  43. }
  44. }
  45. return res;
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement