Alex_tz307

Manual Heap

Sep 11th, 2020 (edited)
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.52 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin ("text.in");
  6. ofstream fout ("text.out");
  7.  
  8. struct PQ {
  9.   int q[1 << 18], n;
  10. };
  11.  
  12. inline void PQ_init (PQ *Q) {
  13.   Q -> n = 0;
  14. }
  15.  
  16. int Parent (int node) {
  17.   if (node == 1)
  18.     return -1;
  19.   return node / 2;
  20. }
  21.  
  22. inline int Left (int node) {
  23.   return 2 * node;
  24. }
  25.  
  26. inline int Right (int node) {
  27.   return 2 * node + 1;
  28. }
  29.  
  30. void Bubble_Up (PQ *Q, int p) {
  31.   if (Parent(p) == -1)
  32.     return;
  33.   if (Q -> q[Parent(p)] > Q -> q[p]) {
  34.     swap (Q -> q[Parent(p)], Q -> q[p]);
  35.     Bubble_Up(Q, Parent(p));
  36.   }
  37. }
  38.  
  39. void Insert (PQ *Q, int x) {
  40.   Q -> n ++;
  41.   Q -> q[Q -> n] = x;
  42.   Bubble_Up (Q, Q -> n);
  43. }
  44.  
  45. void Make_Heap (PQ *Q, int a[], int n) {
  46.   PQ_init(Q);
  47.   for (int i = 0; i < n; i ++)
  48.     Insert (Q, a[i]);
  49. }
  50.  
  51. void Bubble_Down (PQ *Q, int p) {
  52.   int st = Left (p),
  53.       min_index = p;
  54.   for (int i = 0; i < 2; i ++)
  55.     if ((st + i) <= Q -> n)
  56.       if (Q -> q[min_index] > Q -> q[st + i])
  57.         min_index = st + i;
  58.   if (min_index != p) {
  59.     swap (Q -> q[min_index], Q -> q[p]);
  60.     Bubble_Down (Q, min_index);
  61.   }
  62. }
  63.  
  64. int Min (PQ *Q) {
  65.   int Min = Q -> q[1];
  66.   Q -> q[1] = Q -> q[Q -> n];
  67.   Q -> n --;
  68.   Bubble_Down (Q, 1);
  69.   return Min;
  70. }
  71.  
  72. void HeapSort (int a[], int n) {
  73.   PQ Q;
  74.   Make_Heap(&Q, a, n);
  75.   for (int i = 0; i < n; i ++)
  76.     a[i] = Min (&Q);
  77. }
  78.  
  79. int main () {
  80.   int a[] = {1, 4, 7, 9, 2, 3, 6, 5, 1, 2, 3, 10}, n = 12;
  81.   HeapSort(a, n);
  82.   for (int i = 0; i < n; i ++)
  83.     fout << a[i] << ' ';
  84.   return 0;
  85. }
  86.  
Add Comment
Please, Sign In to add comment