fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h> // Para a função memcpy
  4.  
  5. // Código do mergesort:
  6.  
  7. void intercalar(
  8. char *array1,
  9. char *array2,
  10. size_t tamanho_array1,
  11. size_t tamanho_array2,
  12. char *aux,
  13. size_t tamanho_elemento,
  14. int (* comparador)(void *, void *)
  15. ) {
  16. int a = 0, b = 0, c = 0;
  17. while (a < tamanho_array1 || b < tamanho_array2) {
  18. int ain = a < tamanho_array1;
  19. int bin = b < tamanho_array2;
  20. char *e1 = ain ? &array1[a * tamanho_elemento] : NULL;
  21. char *e2 = bin ? &array2[b * tamanho_elemento] : NULL;
  22. char *e3 = &aux[c * tamanho_elemento];
  23. char *comp = (e2 == NULL || (e1 != NULL && comparador(e1, e2) <= 0)) ? e1 : e2;
  24. memcpy(e3, comp, tamanho_elemento);
  25. if (comp == e1) a++; else b++;
  26. c++;
  27. }
  28. }
  29.  
  30. void mergesort_aux(
  31. char *array,
  32. char *aux,
  33. size_t tamanho_elemento,
  34. size_t tamanho_array,
  35. int (* comparador)(void *, void *)
  36. ) {
  37. if (tamanho_array < 2) return;
  38. int metade1 = tamanho_array / 2;
  39. int metade2 = tamanho_array - metade1;
  40. mergesort_aux(array, aux, tamanho_elemento, metade1, comparador);
  41. char *temp = &array[metade1 * tamanho_elemento];
  42. mergesort_aux(temp, aux, tamanho_elemento, metade2, comparador);
  43. intercalar(array, temp, metade1, metade2, aux, tamanho_elemento, comparador);
  44. memcpy(array, aux, tamanho_elemento * tamanho_array);
  45. }
  46.  
  47. void mergesort(
  48. void *array,
  49. size_t tamanho_elemento,
  50. size_t tamanho_array,
  51. int (* comparador)(void *, void *)
  52. ) {
  53. void *aux = malloc(tamanho_elemento * tamanho_array);
  54. mergesort_aux((char *) array, (char *) aux, tamanho_elemento, tamanho_array, comparador);
  55. free(aux);
  56. }
  57.  
  58. // Seu código de teste:
  59.  
  60. typedef struct {
  61. int a;
  62. int b;
  63. int c;
  64. } XPTO;
  65.  
  66. void criar_vetor(XPTO *v, int n) {
  67. for (int i = 0; i < n; i++) {
  68. v[i].a = (i % 3) + 4;
  69. v[i].b = 100 - i % 5;
  70. v[i].c = i;
  71. }
  72. }
  73.  
  74. void imprimir_vetor(XPTO *v, int n) {
  75. for (int i = 0; i < n; i++) {
  76. printf("(a=%d b=%d c=%d) ", v[i].a, v[i].b, v[i].c);
  77. }
  78. printf("\n");
  79. }
  80.  
  81. int por_a(void *p1, void *p2) {
  82. XPTO *pp1 = (XPTO *) p1;
  83. XPTO *pp2 = (XPTO *) p2;
  84. return pp1->a - pp2->a;
  85. }
  86.  
  87. int por_b(void *p1, void *p2) {
  88. XPTO *pp1 = (XPTO *) p1;
  89. XPTO *pp2 = (XPTO *) p2;
  90. return pp1->b - pp2->b;
  91. }
  92.  
  93. #define T 20
  94.  
  95. int main(int argc, char* argv[]) {
  96. XPTO v[T];
  97. criar_vetor(v, T);
  98.  
  99. printf("Antes:\n");
  100. imprimir_vetor(v, T);
  101.  
  102. printf("\nPor A:\n");
  103. mergesort(v, sizeof(XPTO), T, por_a);
  104. imprimir_vetor(v, T);
  105.  
  106. criar_vetor(v, T); // Recria o vetor.
  107. printf("\nPor B:\n");
  108. mergesort(v, sizeof(XPTO), T, por_b);
  109. imprimir_vetor(v, T);
  110.  
  111. return 0;
  112. }
Success #stdin #stdout 0s 4360KB
stdin
Standard input is empty
stdout
Antes:
(a=4 b=100 c=0) (a=5 b=99 c=1) (a=6 b=98 c=2) (a=4 b=97 c=3) (a=5 b=96 c=4) (a=6 b=100 c=5) (a=4 b=99 c=6) (a=5 b=98 c=7) (a=6 b=97 c=8) (a=4 b=96 c=9) (a=5 b=100 c=10) (a=6 b=99 c=11) (a=4 b=98 c=12) (a=5 b=97 c=13) (a=6 b=96 c=14) (a=4 b=100 c=15) (a=5 b=99 c=16) (a=6 b=98 c=17) (a=4 b=97 c=18) (a=5 b=96 c=19) 

Por A:
(a=4 b=100 c=0) (a=4 b=97 c=3) (a=4 b=99 c=6) (a=4 b=96 c=9) (a=4 b=98 c=12) (a=4 b=100 c=15) (a=4 b=97 c=18) (a=5 b=99 c=1) (a=5 b=96 c=4) (a=5 b=98 c=7) (a=5 b=100 c=10) (a=5 b=97 c=13) (a=5 b=99 c=16) (a=5 b=96 c=19) (a=6 b=98 c=2) (a=6 b=100 c=5) (a=6 b=97 c=8) (a=6 b=99 c=11) (a=6 b=96 c=14) (a=6 b=98 c=17) 

Por B:
(a=5 b=96 c=4) (a=4 b=96 c=9) (a=6 b=96 c=14) (a=5 b=96 c=19) (a=4 b=97 c=3) (a=6 b=97 c=8) (a=5 b=97 c=13) (a=4 b=97 c=18) (a=6 b=98 c=2) (a=5 b=98 c=7) (a=4 b=98 c=12) (a=6 b=98 c=17) (a=5 b=99 c=1) (a=4 b=99 c=6) (a=6 b=99 c=11) (a=5 b=99 c=16) (a=4 b=100 c=0) (a=6 b=100 c=5) (a=5 b=100 c=10) (a=4 b=100 c=15)