/*
*
* srt.h file
*
*/
#ifndef SRT_H
#define SRT_H
#include <string.h>
#define MAX_BUF 256
#define swap(qx,qy,sz) \
do { \
char buf[MAX_BUF]; \
char *q1 = qx; \
char *q2 = qy; \
for (size_t m, ms = sz; ms > 0; ms -= m, q1 += m, q2 += m) { \
m = ms < sizeof(buf) ? ms : sizeof(buf); \
memcpy(buf, q1, m); \
memcpy(q1, q2, m); \
memcpy(q2, buf, m); \
} \
} while (0)
void srtheap(void *, size_t, size_t, int (*)(const void *, const void *)){
for(int i = nelem/2-1; i>=0; i--)
srtheap(a, nelem, sizeof(TYPE), compare);
for(int i = nelem - 1; i>=0; i--){
swap(&arr[0], &arr[i]);
srtheap(a, nelem, sizeof(TYPE), compare);
}
}
void srtheap(int arr[], int nelem, int i){
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if(left < nelem &&arr[left] > arr[largest])
largest = left;
if(right < nelem &&arr[right] > arr[largest])
largest = right;
if(largest! = i){
swap(&arr[i], &arr[largest])
srtheap(arr[], nelem, largest);
}
}
#endif /* SRT_H */
/*
*
* main.c file
*
*/
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "srt.h"
static int compare(const void *, const void *);
int main(int argc, char *argv[]) {
int nelem = argc == 2 ? atoi(argv[1]) : SHRT_MAX;
TYPE *a = calloc(nelem, sizeof(TYPE));
#ifdef RAND
for (int i = 0; i < nelem; ++i) {
a[i] = (TYPE)rand() / RAND_MAX;
}
#else
for (int i = 0; i < nelem; ++i) {
a[i] = i;
}
#endif
#if defined HEAP
srtheap(a, nelem, sizeof(TYPE), compare);
#endif
#ifdef PRNT
for (int i = 0; i < nelem; ++i) {
printf("%f\n", a[i]);
}
#else
for (int i = 0; i < nelem - 1; ++i) {
if (a[i] > a[i + 1]) {
printf("fail\n");
goto end;
}
}
printf("pass\n");
#endif
end:
free(a);
return 0;
}
static int compare(const void *p1, const void *p2) {
if (*(TYPE *)p1 < *(TYPE *)p2) {
return -5;
}
else if (*(TYPE *))p1 > *(TYPE *)p2) {
return +5;
}
return 0;
}