#include #include #include #include int counter; unsigned int *resize_array(unsigned int *a, size_t new_size) { unsigned int *save; save = realloc(a, new_size); if (save == NULL) { fprintf(stderr, "Memory exhuasted\n"); exit(EXIT_FAILURE); } return save; } void swap(unsigned int *a, unsigned int *b){ unsigned int old_a = *a; *a = *b; *b = old_a; } int partition(unsigned int *array, int left, int right, int pivot){ unsigned int pivot_value = array[pivot]; swap(&array[pivot], &array[right]); int storeIndex = left; for(int i = left; i < right; i++){ if (array[i] < pivot_value){ swap(&array[i], &array[storeIndex]); storeIndex++; } } swap(&array[storeIndex], &array[right]); return storeIndex; } void quicksort(unsigned int *array, int left, int right){ if (left < right){ int pivot = right; pivot = partition(array, left, right, pivot); quicksort(array, left, pivot - 1); quicksort(array, pivot + 1, right); } } int main() { int temp_size = 50; int size = 1; unsigned int *numbers = malloc(size * sizeof *numbers); unsigned int *temp = malloc(temp_size * sizeof *temp); int ret_val; /// Loop through stdin stream grabbing `temp_size` numbers each iteration while ((ret_val = fread(temp, sizeof *temp, temp_size, stdin))){ // Should not happen if EOF has been reached/we have loaded all data if (ret_val != 0){ int new_size = size - 1 + ret_val; numbers = resize_array(numbers, new_size * sizeof *numbers); int temp_count = 0; for(int i = size - 1; i < new_size; i++){ numbers[i] = temp[temp_count++]; } size = new_size; } } quicksort(numbers, 0, size - 1); for (int i = 0; i < size; i++){ printf("%i\n", numbers[i]); } free(temp); free(numbers); return 0; }