Advertisement
darkjessy94

Mergesort

Sep 8th, 2017
480
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. /*
  2. ** merge_sort.c
  3. **
  4. ** Codifica in linguaggio C dell'algoritmo Merge Sort
  5. ** per l'ordinamento di un array di numeri interi.
  6. **
  7. **
  8. ** Pseudo-codifica dell'algoritmo
  9. **
  10. ** MergeSort(A, p, r):
  11. ** 1. se p<r allora
  12. ** 2. q = (p+r)/2
  13. ** 3. MergeSort(A, p, q)
  14. ** 4. MergeSort(A, q+1, r)
  15. ** 5. Merge(A, p, q, r)
  16. ** End
  17. **
  18. ** Merge(A, p, q, r)
  19. ** 1. siano i=p, j=q+1, k=0
  20. ** 2. fintanto che i<=q e j<=r ripeti:
  21. ** 3. se A(i)<A(j) allora B(k)=A(i), i=i+1, k=k+1
  22. ** altrimenti B(k)=A(j), j=j+1, k=k+1
  23. ** 4. fine-ciclo
  24. ** 5. copia (A(i), ..., A(q)) in B
  25. ** 6. copia (A(j), ..., A(r)) in B
  26. ** 7. copia B in A
  27. ** End
  28. **
  29. ** Marco Liverani (liverani@mat.uniroma3.it) - Aprile 2001
  30. **
  31. */
  32.  
  33. #include <stdlib.h>
  34. #include <stdio.h>
  35.  
  36. #define MAX 300
  37.  
  38. /*
  39. * Legge in input il numero n ed n numeri interi
  40. * che memorizza nell'array. Restituisce il numero
  41. * di elementi letti (n).
  42. */
  43.  
  44. int leggi_array(int V[]) {
  45. int n, i;
  46. printf("Numero di elementi: ");
  47. scanf("%d", &n);
  48. for (i=0; i<n; i++)
  49. scanf("%d", &V[i]);
  50. return(n);
  51. }
  52.  
  53.  
  54. /*
  55. * Stampa in output l'array.
  56. */
  57.  
  58. void stampa_array(int V[], int n) {
  59. int i;
  60. for (i=0; i<n; i++) {
  61. printf("%d ", V[i]);
  62. }
  63. printf("\n");
  64. return;
  65. }
  66.  
  67. /*
  68. * Funzione Merge per la fusione di due
  69. * componenti ordinate dell'array.
  70. */
  71.  
  72. void Merge(int A[], int iniz, int mediano, int fine) {
  73. int i, j, k, B[MAX];
  74. i = iniz;///i scorrerà da iniz a mediano
  75. j = mediano+1; ///j scorrerà da mediano+1 a fine
  76. k = 0;///indice di B
  77. while (i<=mediano && j<=fine) {
  78. if (A[i]<A[j]) {
  79. B[k] = A[i];
  80. i++;
  81. } else {
  82. B[k] = A[j];
  83. j++;
  84. }
  85. k++;
  86. }
  87. while (i <= mediano) {
  88. B[k] = A[i];
  89. i++;
  90. k++;
  91. }
  92. while (j <= fine) {
  93. B[k] = A[j];
  94. j++;
  95. k++;
  96. }
  97. for (k=iniz; k<=fine; k++)
  98. A[k] = B[k-iniz];
  99. //return;
  100. }
  101.  
  102.  
  103. /*
  104. * Funzione ricorsiva MergeSort.
  105. */
  106.  
  107. void MergeSort(int A[], int iniz, int fine) {
  108. int mediano;
  109. if (iniz < fine) ///se abbiamo solo 1 elemento
  110. {
  111. mediano = (iniz+fine)/2;
  112. MergeSort(A, iniz, mediano);
  113. MergeSort(A, mediano+1, fine);
  114. Merge(A, iniz, mediano, fine);
  115. }
  116. //return;
  117. }
  118.  
  119.  
  120. /*
  121. * Funzione principale
  122. */
  123.  
  124. int main(void) {
  125. int n, V[MAX];
  126. n = leggi_array(V);
  127. MergeSort(V, 0, n-1);
  128. stampa_array(V, n);
  129. return(0);
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement