Advertisement
newbie27

Untitled

Oct 22nd, 2022
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.70 KB | Source Code | 0 0
  1. /*Learning recursion via merge sort. Why does it crash when I try sorting more than 12 numbers?*/
  2.  
  3.  
  4. #include <stdio.h>
  5.  
  6. #include <stdlib.h>
  7.  
  8. #include <string.h>
  9.  
  10. #include <ctype.h>
  11.  
  12. #define MAGIC_NUMBER 256
  13.  
  14.  
  15. int *malloc_calls[MAGIC_NUMBER]; //store result of each malloc() here
  16.  
  17. int malloc_count = 0; //keep track of malloc calls
  18.  
  19.  
  20. int* sort (int *random, int length);
  21.  
  22. int* merge (int *right_half_sorted, int right_half_length, int *left_half_sorted, int left_half_length);
  23.  
  24.  
  25. int main(int argc, char const *argv[])
  26.  
  27. {
  28.  
  29. printf("Enter unsorted numbers: ");
  30.  
  31. char string[MAGIC_NUMBER];
  32.  
  33. fgets(string, MAGIC_NUMBER, stdin);
  34.  
  35. int length = strlen(string) - 1;
  36.  
  37.  
  38. int random_array[length];
  39.  
  40.  
  41. for (size_t i = 0; i < length; i++)
  42.  
  43. {
  44.  
  45. random_array[i] = string[i] - 48; //covert string number to regular number
  46.  
  47. }
  48.  
  49. int *sorted_array = sort(random_array, length);
  50.  
  51. for (int i = 0; i < length; i++)
  52.  
  53. {
  54.  
  55. printf("%i ", sorted_array[i]); //print sorted numbers separated by space
  56.  
  57. }
  58.  
  59. for (size_t i = 0; i < malloc_count; i++)
  60.  
  61. {
  62.  
  63. free(malloc_calls[i]); //free all mallocs
  64.  
  65. }
  66.  
  67. return 0;
  68.  
  69. }
  70.  
  71.  
  72. int* sort (int *random, int length)
  73.  
  74. {
  75.  
  76. if(length < 1){
  77.  
  78. printf("Invalid Length");
  79.  
  80. }
  81.  
  82. else if (length == 1)
  83.  
  84. {
  85.  
  86. return random;
  87.  
  88. }
  89.  
  90. else
  91.  
  92. {
  93.  
  94. int r = length%2; //store remainder in case length is odd
  95.  
  96. int l1 = length / 2;
  97.  
  98. int l2 = l1 + r; //remainder added so nothing is lost during division
  99.  
  100.  
  101. int *right_half = random;
  102.  
  103. int *left_half = random + l1;
  104.  
  105.  
  106. int *sorted1 = sort(right_half, l1);
  107.  
  108. int *sorted2 = sort(left_half, l2);
  109.  
  110.  
  111. int *merged = merge(sorted1, l1, sorted2, l2);
  112.  
  113. }
  114.  
  115. }
  116.  
  117.  
  118. int* merge (int *right_half_sorted, int right_half_length, int *left_half_sorted, int left_half_length)
  119.  
  120. {
  121.  
  122. int combined_length = right_half_length + left_half_length;
  123.  
  124. int* new_sorted_array = malloc(combined_length);
  125.  
  126.  
  127. int i = 0; //left half index
  128.  
  129. int j = 0; //right half index
  130.  
  131. int k = 0; //new array index
  132.  
  133.  
  134. for (size_t k = 0; k < combined_length; k++)
  135.  
  136. {
  137.  
  138. if (i == left_half_length) //reached the end of left half
  139.  
  140. {
  141.  
  142. new_sorted_array[k] = right_half_sorted[j];
  143.  
  144. j++;
  145.  
  146. }
  147.  
  148. else if (j == right_half_length) //reached the end of right half
  149.  
  150. {
  151.  
  152. new_sorted_array[k] = left_half_sorted[i];
  153.  
  154. i++;
  155.  
  156. }
  157.  
  158. else
  159.  
  160. {
  161.  
  162. if (left_half_sorted[i] < right_half_sorted[j]) {
  163.  
  164. new_sorted_array[k] = left_half_sorted[i];
  165.  
  166.         i++;
  167.  
  168. }
  169.  
  170. else {
  171.  
  172. new_sorted_array[k] = right_half_sorted[j];
  173.  
  174. j++;
  175.  
  176. }
  177.  
  178. }
  179.  
  180. }
  181.  
  182.  
  183. malloc_calls[malloc_count] = new_sorted_array; //store result of malloc call to free later
  184.  
  185. malloc_count++;
  186.  
  187. return new_sorted_array;
  188.  
  189.  
  190.     }
  191.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement