void quicksort_ints(int *array, size_t nmemb) { // Tail call quicksort while (nmemb > 1) { int pivotIndex = median_of_three_ints(array, nmemb); swap(&array[pivotIndex], &array[0]); pivotIndex = do_quicksort(array, nmemb); quicksort_ints(&array[pivotIndex+1], nmemb - 1 - pivotIndex); nmemb = pivotIndex; } }
/* * Reads the values, begins the timer, calls the sorting algorithm, * stops the timer and outputs the values. The time taken is printed * to standard error. */ static unsigned int do_sort(const char *const algorithm, FILE * infile, FILE * outfile) { int err = 0; double start, end; unsigned long n, nbits; unsigned long *ary; ary = get_values(infile, &n, &nbits); if (!ary) return 1; start = get_current_seconds(); if (strcmp(algorithm, counting_sort_str) == 0) { err = do_counting_sort(ary, n, nbits); } else if (strcmp(algorithm, radix_sort_str) == 0) { err = do_radix_sort(ary, n, nbits); } else if (strcmp(algorithm, quick_sort_str) == 0) { err = do_quicksort(ary, n, nbits); } else if (strcmp(algorithm, insertion_sort_str) == 0) { err = do_insertion_sort(ary, n, nbits); } else if (strcmp(algorithm, system_quick_sort_str) == 0) { err = do_system_quicksort(ary, n, nbits); } else { fprintf(stderr, "Impossible\n"); exit(EXIT_FAILURE); } end = get_current_seconds(); output_from_array(outfile, ary, n); fprintf(stderr, "%f\n", end - start); free(ary); return err; }