C library function to perform sort
qsort()
is the function you're looking for. You call it with a pointer to your array of data, the number of elements in that array, the size of each element and a comparison function.
It does its magic and your array is sorted in-place. An example follows:
#include <stdio.h>#include <stdlib.h>int comp (const void * elem1, const void * elem2) { int f = *((int*)elem1); int s = *((int*)elem2); if (f > s) return 1; if (f < s) return -1; return 0;}int main(int argc, char* argv[]) { int x[] = {4,5,2,3,1,0,9,8,6,7}; qsort (x, sizeof(x)/sizeof(*x), sizeof(*x), comp); for (int i = 0 ; i < 10 ; i++) printf ("%d ", x[i]); return 0;}
C/C++ standard library <stdlib.h>
contains qsort
function.
This is not the best quick sort implementation in the world but it fast enough and VERYEASY to be used... the formal syntax of qsort is:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
The only thing that you need to implement is the compare_function, which takes in twoarguments of type "const void", which can be cast to appropriate data structure, and thenreturn one of these three values:
- negative, if a should be before b
- 0, if a equal to b
- positive, if a should be after b
1. Comparing a list of integers:
simply cast a and b to integersif x < y
,x-y
is negative, x == y
, x-y = 0
, x > y
, x-y
is positivex-y
is a shortcut way to do it :)reverse *x - *y
to *y - *x
for sorting in decreasing/reverse order
int compare_function(const void *a,const void *b) {int *x = (int *) a;int *y = (int *) b;return *x - *y;}
2. Comparing a list of strings:
For comparing string, you need strcmp
function inside <string.h>
lib.strcmp
will by default return -ve,0,ve appropriately... to sort in reverse order, just reverse the sign returned by strcmp
#include <string.h>int compare_function(const void *a,const void *b) {return (strcmp((char *)a,(char *)b));}
3. Comparing floating point numbers:
int compare_function(const void *a,const void *b) {double *x = (double *) a;double *y = (double *) b;// return *x - *y; // this is WRONG...if (*x < *y) return -1;else if (*x > *y) return 1; return 0;}
4. Comparing records based on a key:
Sometimes you need to sort a more complex stuffs, such as record. Here is the simplestway to do it using qsort
library.
typedef struct {int key;double value;} the_record;int compare_function(const void *a,const void *b) {the_record *x = (the_record *) a;the_record *y = (the_record *) b;return x->key - y->key;}
For sure: qsort()
is an implementation of a sort (not necessarily quicksort as its name might suggest).
Try man 3 qsort or have a read at http://linux.die.net/man/3/qsort