Advertisement
Guest User

Untitled

a guest
Jan 16th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void mergesort(int *v, int n);
  5. void sort(int *v, int *c, int i, int f);
  6. void merge(int *v, int *c, int i, int m, int f);
  7.  
  8. int main (void) {
  9. int i;
  10. int v[8] = { -1, 7, -3, 11, 4, -2, 4, 8 };
  11.  
  12. mergesort(v, 8);
  13.  
  14. for (i = 0; i < 8; i++) printf("%d ", v[i]);
  15.  
  16. putchar('\n');
  17.  
  18. return 0;
  19. }
  20.  
  21. /*
  22. Dado um vetor de inteiros v e um inteiro n >= 0, ordena o vetor v[0..n-1] em ordem crescente.
  23. */
  24. void mergesort(int *v, int n) {
  25. int *c = malloc(sizeof(int) * n);
  26. sort(v, c, 0, n - 1);
  27. free(c);
  28. }
  29.  
  30. /*
  31. Dado um vetor de inteiros v e dois inteiros i e f, ordena o vetor v[i..f] em ordem crescente.
  32. O vetor c é utilizado internamente durante a ordenação.
  33. */
  34. void sort(int *v, int *c, int i, int f) {
  35. if (i >= f) return;
  36.  
  37. int m = (i + f) / 2;
  38.  
  39. sort(v, c, i, m);
  40. sort(v, c, m + 1, f);
  41.  
  42. /* Se v[m] <= v[m + 1], então v[i..f] já está ordenado. */
  43. if (v[m] <= v[m + 1]) return;
  44.  
  45. merge(v, c, i, m, f);
  46. }
  47.  
  48.  
  49. /*
  50. Dado um vetor v e três inteiros i, m e f, sendo v[i..m] e v[m+1..f] vetores ordenados,
  51. coloca os elementos destes vetores, em ordem crescente, no vetor em v[i..f].
  52. */
  53. void merge(int *v, int *c, int i, int m, int f) {
  54. int z,
  55. iv = i, ic = m + 1;
  56.  
  57. for (z = i; z <= f; z++) c[z] = v[z];
  58.  
  59. z = i;
  60.  
  61. while (iv <= m && ic <= f) {
  62. /* Invariante: v[i..z] possui os valores de v[iv..m] e v[ic..f] em ordem crescente. */
  63.  
  64. if (c[iv] < c[ic]) v[z++] = c[iv++];
  65. else /* if (c[iv] > c[ic]) */ v[z++] = c[ic++];
  66. }
  67.  
  68. while (iv <= m) v[z++] = c[iv++];
  69.  
  70. while (ic <= f) v[z++] = c[ic++];
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement