-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathpriorityQ_heap.c
117 lines (106 loc) · 2.23 KB
/
priorityQ_heap.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Program to implement priorty Queue using Heap
// Here, the value of the element is its priority
#include <stdio.h>
#include <stdlib.h>
void heapify(int);
void swap(int *, int *);
// Heap array and size
int pq[1000];
int size = -1;
// To Insert into Heap
// Time complexity: O(logn)
void insertIntoHeap(int i)
{
int curr = i;
int parent = (curr - 1) / 2;
while (parent >= 0 && pq[curr] > pq[parent])
{
swap(&pq[curr], &pq[parent]);
curr = parent;
parent = (curr - 1) / 2;
}
}
// To remove from Heap
// Time complexity: O(logn)
void removeFromHeap()
{
int last = pq[size];
pq[0] = last;
size--;
heapify(0);
}
// To get element with max priority
// Time complexity: O(1)
int getMax()
{
if (size == -1)
return -1;
return pq[0];
}
void printHeap()
{
if (size == -1)
{
printf("\nQueue empty");
return;
}
for (int i = 0; i <= size; i++)
printf("%d ", pq[i]);
printf("\n");
}
int main()
{
int ch, el, maxP;
do
{
printf("\n1.Insert into queue");
printf("\n2.Delete from queue");
printf("\n3.Get max priority element");
printf("\n4.Display queue\n");
scanf("%d", &ch);
switch (ch)
{
case 1:
printf("\nEnter element to insert: ");
scanf("%d", &el);
size++;
pq[size] = el;
insertIntoHeap(size);
break;
case 2:
removeFromHeap();
break;
case 3:
maxP = getMax();
if (maxP == -1)
printf("\nEmpty");
else
printf("Max priority element: %d\n", maxP);
break;
case 4:
printHeap();
}
} while (ch < 5);
return 0;
}
void heapify(int i)
{
int largest = i;
int leftChild = (2 * i) + 1;
int rightChild = (2 * i) + 2;
if (leftChild <= size && pq[leftChild] > pq[largest])
largest = leftChild;
if (rightChild <= size && pq[rightChild] > pq[largest])
largest = rightChild;
if (largest != i)
{
swap(&pq[i], &pq[largest]);
heapify(largest);
}
}
void swap(int *p, int *q)
{
int t = *p;
*p = *q;
*q = t;
}