█████████ ████ ███░░░░░███ ░░███ ███ ░░░ ██████ ███████ ██████ ██████ ░███ ███░░███ ███░░███ ███░░███ ███░░███ ░███ ░███ ░███░███ ░███ ░███████ ░███ ░███ ░░███ ███░███ ░███░███ ░███ ░███░░░ ░███ ░███ ░░█████████ ░░██████ ░░████████░░██████ ░░██████ ░░░░░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░░ ░░░░░░

Envío 3877

Problema 0xde - Ordenar un arreglo grande

  • Autor: bryancalisto
  • Fecha: 2021-04-20 03:19:31 UTC (Hace alrededor de 3 años)
Caso # Resultado Tiempo Memoria
#1
Correcto
0.005 s 1 KBi
#2
Correcto
0.004 s 36 KBi
#3
Correcto
0.004 s 5 KBi
#4
Correcto
0.004 s 20 KBi
#5
Correcto
0.004 s 17 KBi
#6
Correcto
0.005 s 57 KBi
#7
Correcto
0.04 s 2 KBi
#8
Correcto
0.054 s 4 KBi
#9
Correcto
0.077 s 2 KBi
#10
Correcto
0.045 s 2 KBi
#11
Correcto
0.054 s 3 KBi
#12
Correcto
0.045 s 3 KBi
#13
Correcto
0.065 s 2 KBi
#14
Correcto
0.047 s 5 KBi
#15
Correcto
0.048 s 2 KBi
#16
Correcto
0.068 s 3 KBi
#17
Correcto
0.062 s 2 KBi
#18
Correcto
0.048 s 59 KBi
#19
Correcto
0.051 s 5 KBi
#20
Correcto
0.052 s 5 KBi
#21
Correcto
0.044 s 3 KBi
#22
Correcto
0.053 s 3 KBi
#23
Correcto
0.058 s 6 KBi
#24
Correcto
0.046 s 2 KBi
#25
Correcto
0.043 s 3 KBi
#26
Correcto
0.045 s 2 KBi
#27
Correcto
0.041 s 2 KBi
Puntos totales: 100 / 100

Código

#include <stdio.h>
#include <stdlib.h>

void merge(int *arr, int l, int m, int r)
{
  int i, j, k, l_len, r_len;
  int *l_tmp;
  int *r_tmp;

  l_len = m - l + 1;
  r_len = r - m;
  l_tmp = (int *)malloc(sizeof(int) * l_len);
  r_tmp = (int *)malloc(sizeof(int) * r_len);

  for (i = 0; i < l_len; i++)
  {
    l_tmp[i] = arr[l + i];
  }

  for (i = 0; i < r_len; i++)
  {
    r_tmp[i] = arr[m + i + 1];
  }

  // Ordenamos en si a los subarreglos que se hayan formado
  i = 0;
  j = 0;
  k = l;

  while (i < l_len && j < r_len)
  {
    if (l_tmp[i] <= r_tmp[j])
    {
      arr[k] = l_tmp[i];
      i++;
    }
    else
    {
      arr[k] = r_tmp[j];
      j++;
    }
    k++;
  }

  // Copiamos al arr completo los elementos restantes de ambas mitades
  while (i < l_len)
  {
    arr[k] = l_tmp[i];
    i++;
    k++;
  }

  while (j < r_len)
  {
    arr[k] = r_tmp[j];
    j++;
    k++;
  }

  free(l_tmp);
  free(r_tmp);
}

void mergeSort(int *arr, int l, int r)
{
  if (l < r)
  {
    // Obtenemos punto medio
    int m = l + (r - l) / 2;
    // Mandamos a ordernar las mitades recursivamente
    mergeSort(arr, l, m);
    mergeSort(arr, m + 1, r);

    // Hacemos merge de las mitades
    merge(arr, l, m, r);
  }
}

int main()
{
  int N, i, j, k;
  fscanf(stdin, " %d", &N);
  int *arr = (int *)malloc(sizeof(int) * N);

  for (i = 0; i < N; i++)
  {
    int num;
    fscanf(stdin, " %d", &arr[i]);
  }

  // Ordenamos (Cualquiera que brinde O(n log n): Merge sort, quick sort, heap sort)
  mergeSort(arr, 0, N - 1);

  // Mostramos
  for (i = 0; i < N; i++)
  {
    printf("%d ", arr[i]);
  }

  free(arr);
}