I am an absolute beginner to programming and am learning it using C. I have just learned function pointers and tried to implement a quicksort function using function pointers to determine the nature of sorting.
//Program implementing a quick-sort function using Hoare method
//to partition using a random pivot.
//Function pointer is used to determine the nature of sort (Ascending / Descending).
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
//Typedef: Function Pointer to be used for determining he nature of sort:
typedef int (*p_compare_function)(long long,long long);
enum BOOLEAN{FALSE,TRUE};
//FUNCTION PROTOTYPES:
//Functions to be used for determining the nature of sort:
int Ascending (long long x,long long y);
int Descending (long long x,long long y);
//Generates a random number between a lower and a upper limit.
long long my_random(long long min, long long max);
//Functions to be used for the actual functioning of the algorithm:
void my_swap(long long* a, long long* b);
long long quicksort_partition( long long* array, long long begin,
long long end, p_compare_function cmp);
void quicksort( long long* array, long long begin, long long end,
p_compare_function cmp);
void printarray(long long *pArray, long long nSize);
int main() {
srand(time(NULL));
long long array[] = {5,2,9,7,3,1,6,8,4,0,4,3,5,67,22,3,644,335,345,24,
33,25,22,5,2,43223,4};
long long arraysize = sizeof(array)/sizeof(*array);
//Testing
quicksort(array,0,arraysize-1,Ascending);
printarray(array,arraysize);
quicksort(array,0,arraysize-1,Descending);
printarray(array,arraysize);
return 0;
}
void printarray(long long *pArray, long long nSize) {
for (long long i=0; i < nSize; i++) {
printf("%lld ",pArray[i]);
}
printf("\n");
}
int Ascending (long long x,long long y) {
if (x < y) {
return TRUE;
}
else {
return FALSE;
}
}
int Descending (long long x,long long y) {
return ( !(Ascending(x,y)) );
}
long long my_random(long long min, long long max) {
long double result;
result = ((double)rand() / ((double)RAND_MAX + 1.0));
result = (result * (max - min));
result += min;
result = (long long) result;
return result;
}
void my_swap(long long* a, long long* b) {
long long temp = *a;
*a = *b;
*b = temp;
}
long long quicksort_partition( long long* array, long long begin,
long long end, p_compare_function cmp) {
//Randomly selecting the pivot.
long long random_index = my_random(begin,end);
long long pivot;
my_swap(&array[begin],&array[random_index]);
pivot = array[begin];
//Partion matheod used : Hoare partition.
long long i = begin - 1;
long long j = end + 1;
while(TRUE) {
do {
j--;
} while (!(cmp(array[j],pivot)) && array[j] != pivot);
do {
i++;
}while ((cmp(array[i],pivot)) && array[i] != pivot);
if (i < j) {
my_swap(&array[i],&array[j]);
}
else {
return j;
}
}
}
void quicksort(long long* array, long long begin, long long end, p_compare_function cmp) {
if (begin < end) {
long long q = quicksort_partition(array, begin, end, cmp);
quicksort(array, begin , q, cmp);
quicksort(array, (q + 1), end , cmp);
}
}
Please point out the bad practises used here and help me to rectify them.