Graph
Fast code starts with a good question: do you really need to inspect everything?
int is_sorted(const int *a, size_t n)
void sort_array(int *tab, unsigned int size)
long binary_search(size_t n, int key, int (*at)(size_t))
void insertion_steps(int *a, size_t n, void (*report)(const int *, size_t))
size_t partition(int *a, size_t lo, size_t hi)
void merge_runs(const int *left, size_t ln, const int *right, size_t rn, int *out)
unsigned long sort_cost(int *a, size_t n)