Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: _TTFH_3500 en 11 Octubre 2018, 01:12 am



Título: ¿Cómo hallar una Permutacion ordenada con MergeSort?
Publicado por: _TTFH_3500 en 11 Octubre 2018, 01:12 am
Dado un arreglo desordenado con n elementos, el siguiente código retorna una permutación tal que al aplicarla al arreglo original los elementos quedan ordenados.

Código
  1. #include <stdio.h>
  2.  
  3. typedef unsigned int uint;
  4.  
  5. void Swap(int &a, int &b) {
  6. int t = a;
  7. a = b;
  8. b = t;
  9. }
  10.  
  11. int* BubbleSort(const int* A, uint n) {
  12. int* P = new int[n];
  13. for (uint i = 0; i < n; i++)
  14. P[i] = i;
  15. bool ordenado;
  16. do {
  17. ordenado = true;
  18. for (uint i = 1; i < n; i++)
  19. if (A[P[i-1]] > A[P[i]]) {
  20. Swap(P[i-1], P[i]);
  21. ordenado = false;
  22. }
  23. } while (!ordenado);
  24. return P;
  25. }
  26.  
  27. int main() {
  28. uint n;
  29. printf("Ingrese la cantidad de numeros: ");
  30. scanf("%u", &n);
  31. printf("Ingrese los numeros:\n");
  32. int* A = new int[n];
  33. for (uint i = 0; i < n; i++)
  34. scanf("%d", &A[i]);
  35. int* P = BubbleSort(A, n);
  36. printf("Los numeros ordenados son:\n");
  37. for (uint i = 0; i < n; i++)
  38. printf("%d ", A[P[i]]);
  39. printf("\n");
  40. delete[] A;
  41. delete[] P;
  42. return 0;
  43. }

Pero lo hace en tiempo O(n^2), en cambio el siguiente codigo: https://www.geeksforgeeks.org/merge-sort/ (https://www.geeksforgeeks.org/merge-sort/) retorna el arreglo ordenado en tiempo O(n log(n))
¿Cómo puedo modificar MergeSort para obtener una permutación ordenada en lugar de ordenar el propio arreglo?



Título: Re: ¿Cómo hallar una Permutacion ordenada con MergeSort?
Publicado por: CalgaryCorpus en 11 Octubre 2018, 05:15 am
Aplica la misma idea que muestras aquí, mantén un arreglo de índices y compara la desrefencia. Cuánto corresponda mover o intercambiar, lo haces en el arreglo de índices.