sorting (macbuntu's conflicted copy 2014-02-18).c~ 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include "sorting.h"
  5. long *Load_File(char * Filename, int *Size){
  6. // num ints in file
  7. int val0 = 0;
  8. // open file for reading
  9. FILE * fptr = NULL;
  10. fptr = fopen(Filename, "r");
  11. if (fptr == NULL){ // check for error
  12. printf("File name error.\n");
  13. return NULL;
  14. }
  15. if(fscanf(fptr, "%d", &val0) == 0){ // check for error
  16. printf("File read error.\n");
  17. return NULL;
  18. }
  19. // scan values into buffer
  20. long *buffer = malloc(sizeof(long) * val0); // malloc return value
  21. if (buffer == NULL){
  22. printf("Buffer malloc error.\n");
  23. return NULL;
  24. }
  25. int i;
  26. for (i = 0; i < val0; i++){
  27. if(fscanf(fptr, "%ld", &buffer[i]) == 0){
  28. printf("File read error.\n");
  29. return NULL; // stop on error
  30. }
  31. }
  32. // clean up
  33. *Size = val0; // assign size
  34. if(!fclose(fptr) == 0){ // close file
  35. printf("File close error.");
  36. return NULL; // return NULL on file close error
  37. }
  38. return buffer;
  39. }
  40. int Save_File(char *Filename, long *Array, int Size){
  41. // count of successful writes
  42. int count = 0;
  43. // write to file
  44. FILE * fptr = NULL;
  45. fptr = fopen(Filename, "w");
  46. if(fprintf(fptr, "%d\n", Size) == 0){
  47. return EXIT_FAILURE;
  48. }
  49. int i;
  50. for(i = 0; i < Size; i++){
  51. count = fprintf(fptr, "%ld\n", Array[i]);
  52. }
  53. // close file
  54. if(!fclose(fptr) == 0){
  55. printf("File close error.");
  56. return EXIT_FAILURE; // return NULL on file close error
  57. }
  58. return count;
  59. }
  60. void Shell_Insertion_Sort(long *Array, int Size, double *N_Comp, double *N_Move){
  61. int cCount = 0; // comp count
  62. int mCount = 0; // move count
  63. int * pratt = genSequence(Size); // generate sequence
  64. // calculate length of sequence
  65. int length = 0;
  66. while(pratt[length] != 0){
  67. length++;
  68. cCount++; // pratt[length] != 0
  69. }
  70. long value = 0; // temp yvalue
  71. int i, j, k;
  72. for(i = length - 1; i >= 0; i--){
  73. for(j = pratt[i]; j < Size; ++j){
  74. mCount++; // j = pratt[i]
  75. value = Array[j];
  76. mCount++; // value = Array[j]
  77. for (k = j - pratt[i]; k >= 0 && Array[k] > Array[k + pratt[i]; k = k - pratt[i]){
  78. cCount++; // Array[k] > Array[k + pratt[i]
  79. Array[k + pratt[i]] = Array[k];
  80. mCount++; // Array[k + pratt[i]] = Array[k]
  81. }
  82. }
  83. }
  84. free(pratt); // free resources
  85. *N_Comp = cCount; // set counters
  86. *N_Move = mCount;
  87. }
  88. void Shell_Selection_Sort(long *Array, int Size, double *N_Comp, double *N_Move){
  89. int cCount = 0; // comp count
  90. int mCount = 0; // move count
  91. int * pratt = genSequence(Size); // generate sequence
  92. // calculate length of sequence
  93. int length = 0;
  94. while(pratt[length] != 0){
  95. length++;
  96. cCount++; // pratt[length] != 0
  97. }
  98. long minVal = 0; // minimum value
  99. int min = 0; // minimum index
  100. int i, j, k;
  101. for(i = length - 1; i >= 0; i++){
  102. for (j = 0; j < Size - 1; j++){
  103. /* find the minimum */
  104. min = j;
  105. for (k = j + 1; k < Size; k++){
  106. if (Array[k] < Array[min]){
  107. min = k;
  108. cCount++; // Array[k] < Array[min]
  109. }
  110. }
  111. minVal = Array[min];
  112. mCount++; // minVal = Array[min]
  113. /* move elements to the right */
  114. for (k = min; k > j; k--){
  115. Array[k] = Array[k - 1];
  116. mCount++; // Array[k] = Array[k - 1]
  117. }
  118. Array[j] = minVal;
  119. mCount++; // Array[j] = minVal
  120. }
  121. }
  122. free(pratt); // free sequence
  123. *N_Comp = cCount; // set counter
  124. *N_Move = mCount;
  125. }
  126. // (2^p * 3^q)
  127. int * genSequence(int maxVal){
  128. int numRows = 0; // number of triangle rows needed
  129. int val = 1; // used to count num rows
  130. while(val < maxVal){
  131. numRows++;
  132. val = val * 3; // right side of triangle
  133. }
  134. int arraySize = 0;
  135. int i;
  136. for(i = numRows; i > 0; i--){
  137. arraySize = arraySize + i; // num values in each row
  138. }
  139. int * pratt = calloc(arraySize + 1, sizeof(int)); // add 1 for safety
  140. // initialize values
  141. int currInd = 0; // track current index of array
  142. int currRow = 0; // track row of triangle
  143. int j; // incrementor
  144. for(currRow = 0; currRow < numRows; currRow++){
  145. for(j = 0; j <= currRow; j++){
  146. pratt[currInd] = 1 * genHelp(2, currRow - j) * genHelp(3, j);
  147. currInd++; // cycle through array with proper numbers
  148. }
  149. }
  150. return pratt; // return array
  151. }
  152. int Print_Seq(char *Filename, int maxVal){
  153. // generate sequence
  154. int * sequence = genSequence(maxVal);
  155. // open file for writing
  156. FILE * fptr = NULL;
  157. fptr = fopen(Filename, "w");
  158. // calculate length of array
  159. int length = 0;
  160. while(sequence[length] != 0){
  161. length++;
  162. }
  163. fprintf(fptr, "%d\n", length); // print length first
  164. // print values to file
  165. int i;
  166. for(i = 0; i < length; i++){
  167. fprintf(fptr, "%d\n", sequence[i]);
  168. }
  169. // close file
  170. if(!fclose(fptr) == 0){
  171. printf("File close error.");
  172. return EXIT_FAILURE; // return NULL on file close error
  173. }
  174. free(sequence); // release memory
  175. return length; // return specified value
  176. }
  177. int genHelp(int base, int exponent){
  178. if(exponent <= 0){
  179. return 1;
  180. }
  181. if(exponent == 1){
  182. return base;
  183. }
  184. int retval = 1;
  185. int i;
  186. for(i = 0; i < exponent; i++){
  187. retval = retval * base;
  188. }
  189. return retval;
  190. }