c14-1.c
/* code: c14-1.c (v1.18.00) */
#include <stdio.h>
#include <stdlib.h>
#define MAX_PQ_SIZE 128
#define NODE_PARENT(x) ((x - 1) / 2)
#define NODE_LEFT(x) (2 * x + 1)
#define NODE_RIGHT(x) (2 * x + 2)
struct node {
int priority;
char data[32];
};
typedef struct node NODE;
struct p_queue {
int size;
NODE *elm;
};
typedef struct p_queue P_QUEUE;
/* ------------------------------------------- */
void pq_node_swap (NODE * n1, NODE * n2) {
NODE node_temp;
node_temp = *n1;
*n1 = *n2;
*n2 = node_temp;
}
/* ------------------------------------------- */
P_QUEUE pq_init (int size) {
P_QUEUE pq;
pq.size = 0;
pq.elm = malloc (size * sizeof (NODE));
return pq;
}
/* ------------------------------------------- */
void pq_delete_all (P_QUEUE * pq) {
free (pq->elm);
}
/* ------------------------------------------- */
void pq_display (P_QUEUE * pq) {
int i;
for (i = 0; i < pq->size; i++) {
printf ("heap (%d) (%s)\n", pq->elm[i].priority, pq->elm[i].data);
}
}
/* ------------------------------------------- */
void pq_heapify (P_QUEUE * pq, int i) {
int max;
max = ((NODE_LEFT (i) < pq->size)
&& (pq->elm[NODE_LEFT (i)].priority >
pq->elm[i].priority)) ? NODE_LEFT (i) : i;
if ((NODE_RIGHT (i) < pq->size)
&& (pq->elm[NODE_RIGHT (i)].priority > pq->elm[max].priority)) {
max = NODE_RIGHT (i);
}
if (max != i) {
pq_node_swap (&(pq->elm[i]), &(pq->elm[max]));
pq_heapify (pq, max);
}
}
/* ------------------------------------------- */
void pq_enqueue (P_QUEUE * pq, int priority, char *data) {
NODE node;
int i;
node.priority = priority;
sprintf (node.data, "%s", data);
printf ("enqueue (%2d)(%s)\n", node.priority, node.data);
i = (pq->size)++;
while (i && node.priority > pq->elm[NODE_PARENT (i)].priority) {
pq->elm[i] = pq->elm[NODE_PARENT (i)];
i = NODE_PARENT (i);
}
pq->elm[i] = node;
}
/* ------------------------------------------- */
void pq_dequeue (P_QUEUE * pq) {
if (pq->size) {
printf ("dequeue (%2d)(%s)\n", pq->elm[0].priority, pq->elm[0].data);
pq->elm[0] = pq->elm[--(pq->size)];
pq->elm = realloc (pq->elm, pq->size * sizeof (NODE));
pq_heapify (pq, 0);
}
else {
printf ("priority queue is empty\n");
}
}
/* ------------------------------------------- */
int main () {
P_QUEUE pq;
int i;
pq = pq_init (MAX_PQ_SIZE);
pq_enqueue (&pq, 40, "grape");
pq_enqueue (&pq, 30, "pear");
pq_enqueue (&pq, 10, "banana");
pq_enqueue (&pq, 20, "watermelon");
pq_enqueue (&pq, 50, "apple");
pq_enqueue (&pq, 60, "lemon");
pq_display (&pq);
for (i = 0; i < 7; i++) {
pq_dequeue (&pq);
}
pq_delete_all (&pq);
return 0;
}
c14-2.c
/* code: c14-2.c (v1.18.00) */
#include <stdio.h>
#include <stdlib.h>
/* ------------------------------------------ */
void print_array (int v[], int n) {
int i;
printf ("array: ");
for (i = 0; i < n; i++) {
printf ("%02d ", v[i]);
}
printf ("\n");
}
/* ------------------------------------------- */
int heap_max (int *v, int n, int i, int j, int k) {
int max;
max = i;
if ((j < n) && (v[j] > v[max])) {
max = j;
}
if ((k < n) && (v[k] > v[max])) {
max = k;
}
return max;
}
/* ------------------------------------------- */
void downheap (int *v, int n, int i) {
int left, right, j, temp;
while (1) {
left = 2 * i + 1;
right = 2 * i + 2;
j = heap_max (v, n, i, left, right);
if (j == i) {
break;
}
temp = v[i];
v[i] = v[j];
v[j] = temp;
i = j;
}
}
/* ------------------------------------------- */
void heapsort (int *v, int n) {
int i, temp;
for (i = (n - 2) / 2; i >= 0; i--) {
downheap (v, n, i);
}
for (i = 0; i < n; i++) {
temp = v[n - i - 1];
v[n - i - 1] = v[0];
v[0] = temp;
downheap (v, n - i - 1, 0);
}
}
/* ------------------------------------------- */
int main () {
int array[10]
= { 80, 40, 30, 20, 10, 00, 70, 90, 50, 60 };
print_array (array, 10);
heapsort (array, 10);
print_array (array, 10);
return 0;
}
q14-1.c
/* code: q14-1.c (v1.18.00) */
#include <stdio.h>
#include <stdlib.h>
#define MAX 100000
/* ------------------------------------------ */
void print_array (int v[], int n) {
int i;
printf ("array: ");
for (i = 0; i < n; i++) {
printf ("%d ", v[i]);
}
printf ("\n");
}
/* ------------------------------------------- */
int heap_max (int *v, int n, int i, int j, int k) {
int max;
max = i;
if ((j < n) && (v[j] > v[max])) {
max = j;
}
if ((k < n) && (v[k] > v[max])) {
max = k;
}
return max;
}
/* ------------------------------------------- */
void downheap (int *v, int n, int i) {
int left, right, j, temp;
while (1) {
left = 2 * i + 1;
right = 2 * i + 2;
j = heap_max (v, n, i, left, right);
if (j == i) {
break;
}
temp = v[i];
v[i] = v[j];
v[j] = temp;
i = j;
}
}
/* ------------------------------------------- */
void heapsort (int *v, int n) {
int i, temp;
for (i = (n - 2) / 2; i >= 0; i--) {
downheap (v, n, i);
}
for (i = 0; i < n; i++) {
temp = v[n - i - 1];
v[n - i - 1] = v[0];
v[0] = temp;
downheap (v, n - i - 1, 0);
}
}
/* ------------------------------------------ */
void rand_data (int v[], int n) {
int i;
for (i = 0; i < n; i++) {
v[i] = rand () % (MAX / 10);
}
}
/* ------------------------------------------- */
int main () {
int *array;
array = malloc (sizeof (int) * MAX);
rand_data (array, MAX);
print_array (array, 20);
heapsort (array, MAX);
print_array (array, 20);
free (array);
return 0;
}
q14-2.c
/* code: q14-2.c (v1.18.00) */
#include <stdio.h>
#include <stdlib.h>
#define MAX 100000000
/* ------------------------------------------ */
void print_array (int v[], int n) {
int i;
printf ("array: ");
for (i = 0; i < n; i++) {
printf ("%d ", v[i]);
}
printf ("\n");
}
/* ------------------------------------------- */
int heap_max (int *v, int n, int i, int j, int k) {
int max;
max = i;
if ((j < n) && (v[j] > v[max])) {
max = j;
}
if ((k < n) && (v[k] > v[max])) {
max = k;
}
return max;
}
/* ------------------------------------------- */
void downheap (int *v, int n, int i) {
int left, right, j, temp;
while (1) {
left = 2 * i + 1;
right = 2 * i + 2;
j = heap_max (v, n, i, left, right);
if (j == i) {
break;
}
temp = v[i];
v[i] = v[j];
v[j] = temp;
i = j;
}
}
/* ------------------------------------------- */
void heapsort (int *v, int n) {
int i, temp;
for (i = (n - 2) / 2; i >= 0; i--) {
downheap (v, n, i);
}
for (i = 0; i < n; i++) {
temp = v[n - i - 1];
v[n - i - 1] = v[0];
v[0] = temp;
downheap (v, n - i - 1, 0);
}
}
/* ------------------------------------------ */
void rand_data (int v[], int n) {
int i;
for (i = 0; i < n; i++) {
v[i] = rand () % (MAX / 10);
}
}
/* ------------------------------------------- */
int main () {
int *array;
array = malloc (sizeof (int) * MAX);
rand_data (array, MAX);
print_array (array, 20);
heapsort (array, MAX);
print_array (array, 20);
free (array);
return 0;
}
q14-3.c
/* code: q14-3.c (v1.18.00) */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100000000
/* ------------------------------------------ */
void print_array (int v[], int n) {
int i;
printf ("array: ");
for (i = 0; i < n; i++) {
printf ("%d ", v[i]);
}
printf ("\n");
}
/* ------------------------------------------- */
int heap_max (int *v, int n, int i, int j, int k) {
int max;
max = i;
if ((j < n) && (v[j] > v[max])) {
max = j;
}
if ((k < n) && (v[k] > v[max])) {
max = k;
}
return max;
}
/* ------------------------------------------- */
void downheap (int *v, int n, int i) {
int left, right, j, temp;
while (1) {
left = 2 * i + 1;
right = 2 * i + 2;
j = heap_max (v, n, i, left, right);
if (j == i) {
break;
}
temp = v[i];
v[i] = v[j];
v[j] = temp;
i = j;
}
}
/* ------------------------------------------- */
void heapsort (int *v, int n) {
int i, temp;
for (i = (n - 2) / 2; i >= 0; i--) {
downheap (v, n, i);
}
for (i = 0; i < n; i++) {
temp = v[n - i - 1];
v[n - i - 1] = v[0];
v[0] = temp;
downheap (v, n - i - 1, 0);
}
}
/* ------------------------------------------ */
void rand_data (int v[], int n) {
int i;
for (i = 0; i < n; i++) {
v[i] = rand () % (MAX / 10);
}
}
/* ------------------------------------------- */
int main () {
int *array;
clock_t start, end;
double elapsed_in_seconds;
array = malloc (sizeof (int) * MAX);
rand_data (array, MAX);
print_array (array, 20);
start = clock ();
heapsort (array, MAX);
end = clock ();
print_array (array, 20);
elapsed_in_seconds = (end - start) / (double) CLOCKS_PER_SEC;
printf ("%lf seconds\n", elapsed_in_seconds);
free (array);
return 0;
}
q14-4.c
/* code: q14-4.c (v1.18.00) */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#define MAX 100000000
/* ------------------------------------------ */
void print_array (int v[], int n) {
int i;
printf ("array: ");
for (i = 0; i < n; i++) {
printf ("%d ", v[i]);
}
printf ("\n");
}
/* ------------------------------------------- */
int heap_max (int *v, int n, int i, int j, int k) {
int max;
max = i;
if ((j < n) && (v[j] > v[max])) {
max = j;
}
if ((k < n) && (v[k] > v[max])) {
max = k;
}
return max;
}
/* ------------------------------------------- */
void downheap (int *v, int n, int i) {
int left, right, j, temp;
while (1) {
left = 2 * i + 1;
right = 2 * i + 2;
j = heap_max (v, n, i, left, right);
if (j == i) {
break;
}
temp = v[i];
v[i] = v[j];
v[j] = temp;
i = j;
}
}
/* ------------------------------------------- */
void heapsort (int *v, int n) {
int i, temp;
for (i = (n - 2) / 2; i >= 0; i--) {
downheap (v, n, i);
}
for (i = 0; i < n; i++) {
temp = v[n - i - 1];
v[n - i - 1] = v[0];
v[0] = temp;
downheap (v, n - i - 1, 0);
}
}
/* ------------------------------------------ */
void rand_data (int v[], int n) {
int i;
for (i = 0; i < n; i++) {
v[i] = rand () % (MAX / 10);
}
}
/* ------------------------------------------- */
int main () {
int *array;
struct timeval start, end;
double elapsed_in_seconds;
array = malloc (sizeof (int) * MAX);
rand_data (array, MAX);
print_array (array, 20);
gettimeofday (&start, NULL);
heapsort (array, MAX);
gettimeofday (&end, NULL);
print_array (array, 20);
elapsed_in_seconds = difftime (end.tv_sec, start.tv_sec) +
difftime (end.tv_usec, start.tv_usec) / 1000000.0;
printf ("%lf seconds\n", elapsed_in_seconds);
free (array);
return 0;
}
EOF