123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #include <stddef.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <fcntl.h>
- int counter;
- int *resize_array(int *a, size_t new_size)
- {
- int *save;
- save = realloc(a, new_size);
- if (save == NULL) {
- fprintf(stderr, "Memory exhuasted\n");
- exit(EXIT_FAILURE);
- }
- return save;
- }
- void swap(int *a, int *b){
- int old_a = *a;
- *a = *b;
- *b = old_a;
- }
- int partition(int *array, int left, int right, int pivot){
- 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(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 size = 1;
- int *numbers = malloc(size * sizeof *numbers);
- int *temp = malloc(size * sizeof *temp);
- int error;
- /// Loop through stdin stream grabbing `size` numbers each iteration
- while ((error = fread(temp, sizeof *numbers, 1, stdin))){
- // Should not happen if EOF has been reached or we have loaded all data
- // May happen if we reached EOF at exactly size [didn't find clear documention], in which case next iteration should catch it
- if (error != 0){
- numbers[size - 1] = temp[0];
- size++;
- numbers = resize_array(numbers, size * sizeof *numbers);
- }
- }
- size--;
- quicksort(numbers, 0, size - 1);
- for (int i = 0; i < size; i++){
- printf("%i\n", numbers[i]);
- }
- free(temp);
- free(numbers);
- return 0;
- }
|