Test Foro de elhacker.net SMF 2.1

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 (cpp) [Seleccionar]
#include <stdio.h>

typedef unsigned int uint;

void Swap(int &a, int &b) {
int t = a;
a = b;
b = t;
}

int* BubbleSort(const int* A, uint n) {
int* P = new int[n];
for (uint i = 0; i < n; i++)
P[i] = i;
bool ordenado;
do {
ordenado = true;
for (uint i = 1; i < n; i++)
if (A[P[i-1]] > A[P[i]]) {
Swap(P[i-1], P[i]);
ordenado = false;
}
} while (!ordenado);
return P;
}

int main() {
uint n;
printf("Ingrese la cantidad de numeros: ");
scanf("%u", &n);
printf("Ingrese los numeros:\n");
int* A = new int[n];
for (uint i = 0; i < n; i++)
scanf("%d", &A[i]);
int* P = BubbleSort(A, n);
printf("Los numeros ordenados son:\n");
for (uint i = 0; i < n; i++)
printf("%d ", A[P[i]]);
printf("\n");
delete[] A;
delete[] P;
return 0;
}


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.