Just a couple small c programs.

mysort.c 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <stddef.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <fcntl.h>
  5. int *resize_array(int *a, size_t new_size)
  6. {
  7. int *save;
  8. save = realloc(a, new_size);
  9. if (save == NULL) {
  10. fprintf(stderr, "Memory exhuasted\n");
  11. exit(EXIT_FAILURE);
  12. }
  13. return save;
  14. }
  15. int *quicksort(int *array, size_t size)
  16. {
  17. int lesser[size], less_counter = 0;
  18. int greater[size], great_counter = 0;
  19. if (size < 2)
  20. return array;
  21. // Take last element and make it the pivot, then subtract one
  22. // from size afterwards so that it will no longer be accesssed
  23. int pivot = array[size - 1];
  24. size--;
  25. for(unsigned int i = 0; i < size; i++){
  26. if (array[i] <= pivot){
  27. lesser[less_counter++] = array[i];
  28. }
  29. else {
  30. greater[great_counter++] = array[i];
  31. }
  32. }
  33. int *lesser_sorted = quicksort(lesser, (size_t)less_counter);
  34. int *greater_sorted = quicksort(greater, (size_t)great_counter);
  35. int main_counter;
  36. for(main_counter = 0; main_counter < less_counter; main_counter++){
  37. array[main_counter] = lesser_sorted[main_counter];
  38. }
  39. array[main_counter++] = pivot;
  40. for (int i = 0; i < great_counter; i++){
  41. array[main_counter] = greater_sorted[i];
  42. main_counter++;
  43. }
  44. return array;
  45. }
  46. int main()
  47. {
  48. int size = 1;
  49. int *numbers = malloc(size * sizeof *numbers);
  50. int *temp = malloc(size * sizeof *temp);
  51. int error;
  52. /// Loop through stdin stream grabbing `size` numbers each iteration
  53. while ((error = fread(temp, sizeof *numbers, 1, stdin))){
  54. // Should not happen if EOF has been reached or we have loaded all data
  55. // May happen if we reached EOF at exactly size [didn't find clear documention], in which case next iteration should catch it
  56. if (error != 0){
  57. numbers[size - 1] = temp[0];
  58. size++;
  59. numbers = resize_array(numbers, size * sizeof *numbers);
  60. }
  61. }
  62. size--;
  63. int *sorted_numbers = quicksort(numbers, size);
  64. for (int i = 0; i < size; i++){
  65. printf("%i\n", sorted_numbers[i]);
  66. }
  67. free(temp);
  68. free(sorted_numbers);
  69. return 0;
  70. }