Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <time.h>
  4. #include <stdlib.h>
  5. #include <limits.h>
  6.  
  7. /* USATE LE VOSTRE COSTANTI AL POSTO DI QUELLE INDICATE*/
  8.  
  9. #define N 5000 // dimensione massima dell'array da ordinare
  10. #define STEP 100 // gap tra due esperimenti successivi
  11. #define NUMEXP 100 // numero di volte che un esperimento di una certa dimensione si ripete
  12.  
  13.  
  14. void InsertionSort(int *, int );
  15. void MergeSort(int *,int,int);
  16. void Merge(int *,int,int,int);
  17. void GeneraVettore(int *,int); // genera un vettore casuale di una determinata dimensione
  18. void IbridoMergeSort(int *,int,int,int); // merge sort ibrido con insertion sort
  19. void CopiaVettore(int *,int *,int); // copia un vettore in un altro
  20.  
  21. int main()
  22. {
  23. clock_t start, end; // variabili per la tempistica
  24. int dimensione; // dimensione del vettore attuale durante l'esperimento
  25. int iterazione; // indice dell'iterazione durante l'esperimento
  26. int limite_ibrido; // risultato della prima parte di questo esercizio
  27. int* vettore;
  28. int *vettore_copia; // variabili per mantenere il vettore da ordinare
  29. double IS,MS,IMS; // variabili per mantenere la sommma dei tempi dei tre algoritmi
  30. double mediaIS,mediaMS,mediaIMS; // variabili per le medie dei tempi (al variare dell'iterazione)
  31. FILE *risultati;
  32.  
  33. srand(1); // seme per i numeri casuali (NON USARE 'time')
  34.  
  35. vettore = malloc(sizeof(int)*N);
  36. vettore_copia = malloc(sizeof(int)*N);
  37.  
  38.  
  39. risultati=fopen("risultati_parte_seconda_esercizio1.txt","w");
  40. if (risultati==NULL)
  41. {
  42. printf ("ERRORE nell'apertura del file");
  43. return(1);
  44. }
  45.  
  46. printf ("Inserisci il limite insertion sort VS merge sort: ");
  47. scanf ("%d", &limite_ibrido);
  48. printf ("Dim\t Insertion\t Merge\t\t Hybrid\n");
  49.  
  50.  
  51.  
  52. for(dimensione=STEP;dimensione<=N;dimensione+=STEP)
  53. {
  54. IS = 0;
  55. MS = 0;
  56. IMS = 0;
  57. for (iterazione = 1; iterazione <= NUMEXP; iterazione++)
  58. {
  59. GeneraVettore(vettore,dimensione);
  60. CopiaVettore(vettore,vettore_copia,dimensione);
  61. start = clock();
  62. InsertionSort(vettore,dimensione);
  63. end = clock();
  64. IS = IS + (double)(end-start)/CLOCKS_PER_SEC;
  65.  
  66. CopiaVettore(vettore_copia,vettore,dimensione);
  67.  
  68. start = clock();
  69. MergeSort(vettore,0,dimensione-1);
  70. end = clock();
  71. MS = MS + (double)(end-start)/CLOCKS_PER_SEC;
  72.  
  73. CopiaVettore(vettore_copia,vettore,dimensione);
  74.  
  75. start = clock();
  76. IbridoMergeSort(vettore,0,dimensione-1,limite_ibrido);
  77. end= clock();
  78. IMS = IMS + (double)(end-start)/CLOCKS_PER_SEC;
  79.  
  80. }
  81. mediaIS=IS/NUMEXP;
  82. mediaMS=MS/NUMEXP;
  83. mediaIMS=IMS/NUMEXP;
  84.  
  85. printf ("%d\t %f\t %f\t %f\n",dimensione,mediaIS,mediaMS,mediaIMS);
  86. fprintf(risultati,"%d\t %f\t %f\t %f\n",dimensione,mediaIS,mediaMS,mediaIMS);
  87. }
  88. fclose(risultati);
  89.  
  90. }
  91.  
  92. void RangedInsertionSort(int* vettore, int sx, int dx){
  93. int i,j;
  94. for(i=sx; i<dx; i++){
  95. int key= vettore[i];
  96. j=i-1;
  97. while(j>=sx && vettore[j]>key){
  98. vettore[j+1]=vettore[j];
  99. j=j-1;
  100. }
  101. vettore[j+1]=key;
  102. }
  103. return;
  104. }
  105.  
  106. void IbridoMergeSort(int *vettore,int sx,int dx,int limite)
  107. {
  108. /* costruire questa funzione */
  109. if(sx<dx){
  110. int centro= (sx+dx)/2;
  111. if((dx-sx)<=limite){
  112. RangedInsertionSort(vettore,sx,dx);
  113. }else{
  114. IbridoMergeSort(vettore,sx,centro,limite);
  115. IbridoMergeSort(vettore,centro+1,dx,limite);
  116. Merge(vettore,sx,centro,dx);
  117. }
  118. }
  119. return;
  120. }
  121.  
  122. void InsertionSort(int *vettore, int dimensione)
  123. {
  124. /* fare questa funzione */
  125. int i,j;
  126. for(i=1; i<dimensione; i++){
  127. int key= vettore[i];
  128. j=i-1;
  129. while(j>=0 && vettore[j]>key){
  130. vettore[j+1]=vettore[j];
  131. j=j-1;
  132. }
  133. vettore[j+1]=key;
  134. }
  135.  
  136. return;
  137. }
  138.  
  139.  
  140.  
  141. void MergeSort(int *vettore,int sx,int dx)
  142. {
  143. /* fare questa funzione */
  144. if(sx<dx){
  145. int centro= (sx+dx)/2;
  146. MergeSort(vettore,sx,centro);
  147. MergeSort(vettore,centro+1,dx);
  148. Merge(vettore,sx,centro,dx);
  149. }
  150. return;
  151. }
  152.  
  153. void Merge(int *vettore,int sx,int centro,int dx)
  154. {
  155. /* fare questa funzione */
  156. int i=sx;
  157. int k=0;
  158. int j= centro+1;
  159. int* b;
  160. b=(malloc(sizeof(int)*(dx-sx+1)));
  161. while(i<centro && j<= dx){
  162. if(vettore[i]<=vettore[j]){
  163. b[k]=vettore[i];
  164. i++;
  165. }else{
  166. b[k]=vettore[j];
  167. j++;
  168. }
  169. k++;
  170. }
  171. while(i<=centro){
  172. b[k]=vettore[i];
  173. i++;
  174. k++;
  175. }
  176. while(j<=dx){
  177. b[k]=vettore[j];
  178. j++;
  179. k++;
  180. }
  181. for(k=sx; k< dx; k++)
  182. vettore[k]=b[k-sx];
  183.  
  184. return;
  185. }
  186.  
  187. void GeneraVettore(int *vettore, int dimensione)
  188. {
  189. int i;
  190. int casuale;
  191.  
  192. for(i=0;i<dimensione;i++)
  193. {
  194. casuale=rand() % dimensione;
  195. vettore[i]=casuale;
  196. }
  197. }
  198.  
  199. void CopiaVettore(int *vettore_origine, int *vettore_destinazione, int dimensione)
  200. {
  201. int i;
  202.  
  203. for (i=0;i<dimensione;i++)
  204. {
  205. vettore_destinazione[i]=vettore_origine[i];
  206. }
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement