Advertisement
pedrocasdev

Untitled

Apr 2nd, 2023
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.44 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. // Juntar dois subarrays do array[].
  6. // Primeiro subarray é array[esquerda..meio]
  7. // Segundo subarray é array[meio+1..direita]
  8.  
  9. void merge(int array[], int esquerda, int meio, int direita)
  10. {
  11.     int i, j, k;
  12.     int tamanho_1 = meio - esquerda + 1;//tamanho do primeiro subarray
  13.     int tamanho_2 = direita - meio;//tamanho do segundo subarray
  14.  
  15.     /* criar arrays temporários */
  16.     int sEsquerda[tamanho_1], sDireita[tamanho_2];
  17.    
  18.     /* Copiar os valores para suas respectivas partes*/
  19.     for (i = 0; i < tamanho_1; i++)
  20.         sEsquerda[i] = array[esquerda + i];
  21.     for (j = 0; j < tamanho_2; j++)
  22.         sDireita[j] = array[meio + 1 + j];
  23.  
  24.     /* Juntar os subarrays da direira e esquerda para o array[]*/
  25.     i = 0; // Indice inicial do primeiro subarray
  26.     j = 0; // Indice inicial do segundo subarray
  27.     k = esquerda; /* Indice apontando para a primeira
  28.     posição do array a ser trabalhada*/
  29.    
  30.     while (i < tamanho_1 && j < tamanho_2) {
  31.         //comparando elementos em posições ainda não mescladas nos dois
  32.         //subarrays, o menor elemento é mesclado...
  33.         if (sEsquerda[i] <= sDireita[j]) {
  34.             array[k] = sEsquerda[i];
  35.             i++;
  36.         }
  37.         else {
  38.             array[k] = sDireita[j];
  39.             j++;
  40.         }
  41.         k++;
  42.     }
  43.  
  44.     /* copiar o restantes elementos do subarray da esquerda, se
  45.     tiver algum*/
  46.     while (i < tamanho_1) {
  47.         array[k] = sEsquerda[i];
  48.         i++;
  49.         k++;
  50.     }
  51.  
  52.     /* copiar o restantes elementos do subarray da direita, se
  53.     tiver algum */
  54.     while (j < tamanho_2) {
  55.         array[k] = sDireita[j];
  56.         j++;
  57.         k++;
  58.     }
  59. }
  60.  
  61. void mergeSort(int array[], int esquerda, int direita)
  62. {
  63.     if (esquerda < direita) {
  64.         //Para calcular o ponto médio podemos também usar (esquerda + direita)/2,
  65.         //mas usando este jeito não estariamos a evitar overflow para limites
  66.         //gigantescos
  67.         int meio = esquerda + (direita - esquerda) / 2;
  68.                 mergeSort(array, esquerda, meio);
  69.         mergeSort(array, meio + 1, direita);
  70.         merge(array, esquerda, meio, direita);
  71.     }
  72. }
  73. int main()
  74. {
  75.     int array[] = { 1, 4, 6, 7, 2, 3 };
  76.     int tamanho = sizeof(array) / sizeof(array[0]);
  77.     mergeSort(array, 0, tamanho - 1);
  78.     printf("ARRAY ORDENADO\n");
  79.     for(int i= 0; i<tamanho; i++)
  80.             printf("%d ", array[i]);
  81.     return 0;
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement