/* An example showing the use of the "qsort" function for sorting 100 random numbers. Michael Ashley / UNSW / 11-Apr-2003 */ #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <assert.h> int myComparisonFunction(const void *x, const void *y) { // x and y are pointers to doubles. // Returns -1 if x < y // 0 if x == y // +1 if x > y double dx, dy; dx = *(double *)x; dy = *(double *)y; if (dx < dy) { return -1; } else if (dx > dy) { return +1; } return 0; } int main(void) { struct timeval t; double data[100]; int i; // Obtain the time of day, to microsecond resolution. assert(0 == gettimeofday(&t, NULL)); // Use the number of microseconds as the seed for the system // random number generator. srandom(t.tv_usec); // Generate 100 random numbers between 0.0 and 1.0. for (i = 0; i < ((sizeof data) / (sizeof data[0])); i++) { data[i] = random()/((double) RAND_MAX); } // Now sort them into ascending order. qsort(data, (sizeof data) / (sizeof data[0]), sizeof data[0], &myComparisonFunction); // And print them out. for (i = 0; i < ((sizeof data) / (sizeof data[0])); i++) { printf ("data[%d] = %f\n", i, data[i]); } return 0; }
And here is a really tricky example showing how to sort character strings.
/* An example showing the use of the "qsort" function for sorting up to 100 character strings. Michael Ashley / UNSW / 11-Apr-2003 */ #include <stdio.h> #include <assert.h> #include <string.h> int myComparisonFunction(const void *x, const void *y) { // This is a wrapper for the "strcmp" function. // x and y are pointers to pointers to character strings // Returns -1 if x < y // 0 if x == y // +1 if x > y return (strcmp(*(const char **)x, *(const char **)y)); } int main(void) { char *data[100]; char *p; int i, numStrings; // Read up to 100 character strings from standard input. for (i = 0; i < ((sizeof data) / (sizeof data[0])); i++) { if (1 != scanf("%as", &data[i])) { break; } } numStrings = i; printf ("%d strings found\n", numStrings); // Sort them alphabetically. qsort(data, numStrings, sizeof data[0], &myComparisonFunction); // Print them out, and free the memory malloc'ed by scanf. for (i = 0; i < numStrings; i++) { printf("data[%d] = \"%s\"\n", i, data[i]); free(data[i]); } return 0; }