/* * Program to test sort function: * Generate a random sequence of N integers, sort them, and check * that the sort succeeded. Program gets N from command-line * argument. */ #include #include /* counter for number of comparisons -- a bit ugly */ int num_compares = 0; /* function declarations */ void fill_with_random(int nums[], int size); void sort(int nums[], int size); void sort_check(int nums[], int size); int compare(const void *elem1, const void *elem2); /* * main program */ int main(int argc, char* argv[]) { int N; int *nums; char *end_ptr; /* for strtol error checking */ /* process command-line argument */ if (argc < 2) { fprintf(stderr, "usage: %s number_to_sort\n", argv[0]); return EXIT_FAILURE; } N = strtol(argv[1], &end_ptr, 10); if ((*end_ptr != '\0') || (N <= 0)) { fprintf(stderr, "number to sort must be a positive integer\n"); return EXIT_FAILURE; } /* allocate space for array */ nums = malloc(sizeof(*nums) * N); if (nums == NULL) { fprintf(stderr, "could not allocate space for %d ints\n", N); return EXIT_FAILURE; } /* fill, sort, check as before */ fill_with_random(nums, N); sort(nums, N); sort_check(nums, N); /* print number of comparisons, collected during sort */ fprintf(stdout, "%d comparisons\n", num_compares); /* free allocated space */ free(nums); return EXIT_SUCCESS; } /* * fills nums[0 .. size-1] with a random sequence of integers */ void fill_with_random(int nums[], int size) { int i; for (i = 0; i < size; ++i) { nums[i] = rand(); } } /* * prints "sort succeeded" if nums[0 .. size-1] is in order, * "sort failed" if not */ void sort_check(int nums[], int size) { int i; for (i = 0; i < size-1 ; ++i) { if ( !(nums[i] <= nums[i+1])) { printf("sort failed\n"); return; } } printf("sort succeeded\n"); } /* * sorts nums[0 .. size-1] */ void sort(int nums[], int size) { qsort(nums, size, sizeof(nums[0]), &compare); } /* * compares two elements of the array (for qsort), also incrementing * global counter of number of comparisons */ int compare(const void *elem1, const void *elem2) { int *e1 = (int *) elem1; int *e2 = (int *) elem2; ++num_compares; if (*e1 < *e2) return -1; else if (*e1 > *e2) return 1; else return 0; }